Floyd-Warshall 算法-- 最短路徑(適合節點密集的圖)
?由於此算法時間復雜度為O(V3)。大多數情況下不如迪傑斯特拉算法的。迪傑斯特拉算法適合於節點疏散的圖。
?演示樣例圖例如以下:
?
?
Step 1 創建節點與邊的最短路徑結果表(直接可達關系)。數值表示距離。INF表示不可達
? | 1 | 2 | 3 | 4 |
1 | 0 | 8 | INF | 1 |
2 | INF | 0 | 1 | INF |
3 | 4 | INF | 0 | INF |
4 | INF | 2 | 9 | 0 |
Step2 找出全部經過1的路徑。更新兩點間的最短路徑
經過1的路徑即全部入度和出度路徑的組合,總數為入度×出度:
?
?
經過1路徑為:
第一條,3-1-2
眼下MIN(3->2)為INF,而MIN(3->1->2)=4+8=12 因此MIN(3->2)為12,由於2有更新,故要遞歸更新全部從3到2可達點的最短路徑。而2可達點僅僅有3,MIN(3->3)為0,因此不須要更新。
第二條,3-1-4
眼下MIN(3->4)為INF,而MIN(3->1->4)=4+1=5,因此MIN(3->4)為5,由於4有更新,故要遞歸更新全部從3到4的全部可達點的最短路徑,而4的可達點為3和2:
MIN(3->3)=0,MIN(3->2)=MIN(3->1->2)=12? > MIN(3->1->4->2)= 7。因此MIN(3->2)=7
找出全部經過1路徑的結果為:
?
?
?
? | 1 | 2 | 3 | 4 |
1 | 0 | 8 | INF | 1 |
2 | INF | 0 | 1 | INF |
3 | 4 | 7 | 0 | 5 |
4 | INF | 2 | 9 | 0 |
Step3 找出全部經過2的路徑
?
第1條,1->2->3
由於MIN(1->3)為INF,而MIN(1->2->3)為9。因此MIN(1->3)為9,由於3有更新,所以須要遞歸更新全部從1到3可達點的最短路徑,由於3的可達點為1,而MIN(1->1)不須要更新,為0。如今看第二條路徑:
第二條。4->2->3
因此MIN(4->3)為9,而MIN(4->2->3)為3。因此MIN(4->3)=3
找出全部經過2的路徑後,結果為:
? | 1 | 2 | 3 | 4 |
1 | 0 | 8 | 9 | 1 |
2 | INF | 0 | 1 | INF |
3 | 4 | 7 | 0 | 5 |
4 | 7 | 2 | 3 | 0 |
Step4 找出全部經過3的路徑
第1條。4->3->1
MIN(4->1)為7。而MIN(4->3->1)為13。因此不須要更新
第二條,2->3->1
由於MIN(2->1)為INF,而MIN(2->3->1)為5。因此須要更新MIN(2->1)為5。
由於更新了1,因此須要更新全部從2到1可達點的路徑,1的可達點為4和2,MIN(2->2)不須要更新;眼下MIN(2->4)為INF。而MIN(2->3->1->4)為6。因此MIN(2->4)為6。由於更新了4,因此須要遞歸更新從2到4可達點的路徑,4可達點為2和3,MIN(2->2)為0;MIN(2->3)為1小於MIN(2->3->1->4->3)=1+4+1+9=15。故也不須要更新。
所以經過這一步,結果表為:
?
?
?
? | 1 | 2 | 3 | 4 |
1 | 0 | 8 | 9 | 1 |
2 | 5 | 0 | 1 | 6 |
3 | 4 | 7 | 0 | 5 |
4 | 7 | 2 | 3 | 0 |
最後,找出經過4的路徑。
?
第一條。1->4->2
MIN(1->2)為8,而MIN(1->4->2)為3,因此MIN(1->2)更新為3,由於更新了2。故須要更新全部從1到2可達點的最短路徑,2的可達點為3。MIN(1->3)眼下為9。而MIN(1->4->2->3)為4,因此MIN(1->3)更新為4。由於更新了3。故遞歸更新全部從1到3可達點的最短路徑,3的可達點為1,而MIN(1->1)不須要更新保持為0。
第二條,1->4->3
MIN(1->3)為4,而MIN(1->4->3)為10。因此不須要更新。
所以終於結果為:
? | 1 | 2 | 3 | 4 |
1 | 0 | 3 | 4 | 1 |
2 | 5 | 0 | 1 | 6 |
3 | 4 | 7 | 0 | 5 |
4 | 7 | 2 | 3 | 0 |
?
Floyd-Warshall 算法-- 最短路徑(適合節點密集的圖)