Pku acm 1125 Stockbroker Grapevine 数据结构题目解题报告(八)---- 弗洛伊德(floyd)算法

 
有向图中每一对顶点间的最短路径问题,典型的弗洛伊德算法。
问题描述:已知一个含有 n个顶点的各边权值均大于0的带权有向图,对每对顶点vi!=vj,要求求出每一对顶点之间的最短路径和最短路径长度。
解决方案:弗洛伊德(floyd)算法

3
2
1
对于这样一个例子:               4

                                 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/获得

你可能感兴趣的:(Pku acm 1125 Stockbroker Grapevine 数据结构题目解题报告(八)---- 弗洛伊德(floyd)算法)