floyd算法的一个小细节

今天在写题目的时,对的思路但是一直卡了一个点,后来经过查找原来是floyd算法忽略的一个小细节,以前从来还没有注意到这个小细节,现在把这个细节记录下来

这是原本的代码

	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			for(int  k=1;k<=n;k++){
				if(i==j) continue;
				dis[i][j]=min(dis[i][k]+dis[k][j],dis[i][j]);
			}
		}
	}

这是正确的代码

for(int  k=1;k<=n;k++){
	        for(int i=1;i<=n;i++){
		        for(int j=1;j<=n;j++){
				   if(i==j) continue;
				   dis[i][j]=min(dis[i][k]+dis[k][j],dis[i][j]);
		}
	}		
}

关于k为什么不能写在里面,floyd算法是求得任意两点之间的最小距离

如果把k写里面了,表示i到j就只更新一次,即i到j经过所有k后的最小值,然后i到j就不会更新了

 因此fload的思路是对于通过某一个点去更新,即求出所有i,j经过k点后的最短路径,每次都会把所有i,j更新一遍,会更新n次

posted @ 2023-06-16 18:01  突破铁皮  阅读(11)  评论(0编辑  收藏  举报