Floyd算法直觀證明

考慮很一般的情況
在這裏插入圖片描述

 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]這種形式,才能發揮應有的作用

再來看有向圖

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章