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次