考虑很一般的情况
for(int i=0;i<5;i++) //起点
for(int j=0;j<5;j++) //终点
for(int k=0;k<5;k++) //中介点
if(a[i][k]+a[k][j]==2) //连通
a[i][j]=1; //更新连通性
起i | 终j | 中介k |
---|---|---|
1 | 2 | 4,5 |
1 | 3 | 4 |
1 | 6 | 未连通 |
1 | 7 | 未连通 |
2 | 1 | 4,5 |
2 | 3 | 4 |
2 | 6 | 未连通 |
2 | 7 | 未连通 |
3 | 1 | 4 |
3 | 2 | 4 |
3 | 5 | (3-1-5)(3-2-5) |
4 | 5 | 1,2 |
4 | 6 | 3 |
4 | 7 | 3 |
5 | 3 | (5-1-3)(5-2-3) |
5 | 4 | 1,2 |
5 | 6 | (5-3-6) |
5 | 7 | (5-4-7) |
6 | 7 | 3 |
7 | 1 | 3 |
7 | 2 | 3 |
7 | 4 | 3 |
7 | 5 | (7-3-5) |
7 | 6 | 3 |
从中可以看出Floyd的本质—动态规划:状态取决于前状态
三点连通很好理解,搭个桥而已
问题在于是如何将(5,3)(5,7)这种超过两段的桥架接起来的:
由于循环,求某两点的连通性时会遍历所有的可能中介点,从而通过之前的连通桥得到新的连通,也正是这个过程,可以看到
(1,4)(4,7)这种更新出现在(1,7)后面的桥没有达成,也正说明对于无向图,Floyed算法需要改进成a[i][j]=a[j][i]这种形式,才能发挥应有的作用
再来看有向图