有向图中每一对顶点间的最短路径问题,典型的弗洛伊德算法。
问题描述:已知一个含有
n个顶点的各边权值均大于0的带权有向图,对每对顶点vi!=vj,要求求出每一对顶点之间的最短路径和最短路径长度。
解决方案:弗洛伊德(floyd)算法
解决方案:弗洛伊德(floyd)算法
3
|
2
|
1
|
2
2 5 2 6
A0[i][j]=cost[i][j]:
A0
|
1
|
2
|
3
|
|
A1
|
1
|
2
|
3
|
1
|
0
|
4
|
5
|
|
1
|
0
|
4
|
5
|
2
|
2
|
0
|
6
|
|
2
|
2
|
0
|
min(6,2+5)
|
3
|
2
|
2
|
0
|
|
3
|
2
|
min(2,2+4)
|
0
|
A2
|
1
|
2
|
3
|
|
A3
|
1
|
2
|
3
|
1
|
0
|
4
|
min(5,4+6)
|
|
1
|
0
|
min(4,5+2)
|
5
|
2
|
2
|
0
|
6
|
|
2
|
min(2,6+2)
|
0
|
6
|
3
|
min(2,2+2)
|
2
|
0
|
|
3
|
2
|
2
|
0
|
核心的c代码如下:
for(int k=1;k<=n;k++) //
生成A0,A1,A2...的循环
for(int i=1;i<=n;i++) //
行
for(int j=1;j<=n;j++) //
列
//
如果是i==k||j==k||i==j就保持不变,否则取最小值
array[i][j]=(i==k||j==k||i==j)?array[i][j]:
((array[i][j]<(array[i][k]+array[k][j])?array[i][j]:(array[i][k]+array[k][j])));
最后根据题意,取每行最大值中的最小值即可。
带有详细注释的代码可以在
http://download.csdn.net/user/china8848/获得