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的最短路徑,演算法很像動態 規劃演算法,甚至更...