考慮很一般的情況
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]這種形式,才能發揮應有的作用
再來看有向圖