1. 程式人生 > >Floyd-Warshall 算法-- 最短路徑(適合節點密集的圖)

Floyd-Warshall 算法-- 最短路徑(適合節點密集的圖)

wiki article 2.3 dot pos table 數值 enter lock

?由於此算法時間復雜度為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

,由於3有更新,須要遞歸更新從4到3可達點的最短路徑,由於3的可達點為1,而MIN(4->1)為INF,MIN(4->2->3->1)為7。因此MIN(4->1)為7。由於1有更新,繼續遞歸,1的可達點為4和2,MIN(4->4)保持0;眼下MIN(4->2)為2,而MIN(4->2->3->1->2)=2+1+4+8=15大於2。因此不須要更新。

找出全部經過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 算法-- 最短路徑(適合節點密集的圖)