Floyd---任意两点最短路径
Floyd算法能求出任意两点最短路径,时间复杂度为O(n^3)
遍历每个节点,且遍历每个点作为中间点做松弛.
图:
1 4 2
1 2 9
2 3 1
3 4 3
初始化:
不能直接初始化为0,下面的代码有对边权值的比较,若初始化为0,会出现错误.
if(i == j)时,初始化为0是因为节点到本身的距离为0,若不初始化为0,则会被改为与它相邻最小边的二倍.
1 for(i=1;i<=4;i++) 2 { 3 for(j=1;j<=4;j++) 4 { 5 if(i == j) 6 { 7 map[i][j] = 0; 8 } 9 else 10 { 11 map[i][j] = INF; 12 } 13 14 } 15 }
弗洛伊德(Floyd)
里面两层循环(i和j)是用于遍历邻接矩阵中的每一个点.
外面一层循环(k)则是遍历每一个点作为中间点.
改变层次会发生错误.
1 void floyd()//-------------------------这是错的 2 { 3 int i,j,k; 4 for(i=1;i<=4;k++) 5 { 6 for(j=1;j<=4;i++) 7 { 8 for(k=1;k<=4;j++) 9 { 10 if(map[i][k] + map[k][j] < map[i][j]) 11 { 12 map[i][j] =map[i][k] + map[k][j]; 13 } 14 } 15 } 16 } 17 }
若把k放在里层会过早地遍历完一种节点,导致错误
1 void floyd()//--------------------------这才是对的 2 { 3 int i,j,k; 4 for(k=1;k<=4;k++) 5 { 6 for(i=1;i<=4;i++) 7 { 8 for(j=1;j<=4;j++) 9 { 10 if(map[i][k] + map[k][j] < map[i][j]) 11 { 12 map[i][j] =map[i][k] + map[k][j]; 13 } 14 } 15 } 16 } 17 }
代码:
View Code
1 #include <iostream> 2 using namespace std; 3 int map[5][5]; 4 const int INF = 0x3fffffff; 5 void floyd() 6 { 7 int i,j,k; 8 for(k=1;k<=4;k++) 9 { 10 for(i=1;i<=4;i++) 11 { 12 for(j=1;j<=4;j++) 13 { 14 if(map[i][k] + map[k][j] < map[i][j]) 15 { 16 map[i][j] =map[i][k] + map[k][j]; 17 } 18 } 19 } 20 } 21 } 22 int main() 23 { 24 int i,j; 25 for(i=1;i<=4;i++) 26 { 27 for(j=1;j<=4;j++) 28 { 29 if(i == j) 30 { 31 map[i][j] = 0; 32 } 33 else 34 { 35 map[i][j] = INF; 36 } 37 38 } 39 } 40 for(i=1;i<=4;i++) 41 { 42 int a,c,b; 43 cin>>a>>b>>c; 44 map[a][b]=c; 45 map[b][a]=c; 46 } 47 return 0; 48 }
http://www.cnblogs.com/twjcnblog/archive/2011/09/07/2170306.html
更多,参考这里