Floyd和Dijkstra演算法

2021-10-06 12:23:44 字數 1121 閱讀 9295

floyd演算法

演算法解析:因為一張連通圖中不是所有點到其他點都是有一條直接路徑的,所以我們可以借助別的和終點相連的點到達終點,便是起點-中轉…-終點;

以小推大,

小:假設當前只有1可以當中轉點,start為起點,end為終點;因此當start點需要借助點1到end點時,便需要進行if(edge[start][end]>edge[start][1]+edge[1][end])的判斷,

這個判斷的意思就是 :我的起點到終點的路徑長度是否比中轉方法的長度長,這時我們當然需要優先選擇短的路徑,並且在edge[start][end]中更新,這樣就相當於我們就確定了一條start到end的最佳路徑。

大:理解了小例子後,我們就可以去推測圖上的其他所有點都可以作為某個start到某個end點的中轉點,因此通過不斷比較,不斷更新edge[start][end],我們最後就可以得到start點到end點的最短距離矩陣。

輸入:頂點數,邊數;有向圖;

輸入格式:起點 終點 路徑長度;

樣例:4 8

1 2 2

1 3 6

1 4 4

2 3 3

3 1 7

3 4 1

4 1 5

4 3 12

法時間複雜度:o(n³) 分析:演算法需要執行三個巢狀迴圈,所以需要n³

dijkstra演算法

介紹:用於計算乙個節點到其他節點的最短距離的演算法。

個人演算法分析 1:設兩個集合a和b,a中是訪問過被收納入集合的點,b是還未訪問過的點;

2:設乙個陣列visit,這個陣列記錄每個頂點是否被訪問過;

3:先將起點納入集合a,並且標記訪問為true;

4:找出離起點最短距離的邊,然後更新圖中每個點到起點距離。(就是以找到的這個點為中轉點,判斷其他點是否能夠通過這個點與起點距離拉近)

5:重複步驟4,直至所有點被訪問過;

時間複雜度:o(n²)

樣例8 11

1 2 1

2 4 2

3 1 2

4 3 1

4 6 8

5 4 2

5 7 2

6 5 2

7 6 3

7 8 3

8 6 2

最短路 Floyd演算法和Dijkstra演算法

兩者在負權問題上不是很好,最好只處理正值,dijkstra演算法對負權毫無辦法,但是floyd演算法不能處理出現負環的東西。dijkstra演算法的話,為了方便,我認為從i到i點不可達 百部百科解釋挺好,那個堆優化挺好的 floyd演算法百部百科也不錯,都是老演算法了,哪都有資料 這位筒子的寫得很好...

Dijkstra和Floyd演算法

floyd 演算法 如果要求所有兩結點間的最短路徑,則可以使用 dijkstra演算法n 次完成,時間複雜度是 o n 3 floyd 還提出過另乙個演算法,同樣是 o n 3 的複雜度,但形式上更簡單些。要求的解是乙個矩陣 n n 其中s i j 表示結點i到 j的最短路徑,演算法很像動態 規劃演...

Dijkstra和Floyd演算法

floyd演算法 如果要求所有兩結點間的最短路徑,則可以使用dijkstra演算法n次完成,時間複雜度是 o n 3 floyd還提出過另乙個演算法,同樣是o n 3 的複雜度,但形式上更簡單些。要求的解是乙個矩陣 n n 其中s i j 表示結點i到j的最短路徑,演算法很像動態 規劃演算法,甚至更...