floyd演算法算是最簡單的演算法,沒有之一。
其狀態轉移方程如下map[i , j] =min;
map[i , j]表示 i 到 j 的最短距離,k是窮舉 i , j 的斷點,map[n , n]初值應該為0,或者按照題目意思來做。
當然,如果這條路沒有通的話,還必須特殊處理,比如沒有map[i , k]這條路。
演算法步驟
1,從任意一條單邊路徑開始。所有兩點之間的距離是邊的權,如果兩點之間沒有邊相連,則權為無窮大。
2,對於每一對頂點 u 和 v,看看是否存在乙個頂點 w 使得從 u 到 w 再到 v 比已知的路徑更短。如果是更新它。
把圖用鄰接矩陣g表示出來,如果從vi到vj有路可達,則g[i,j]=d,d表示該路的長度;否則g[i,j]=無窮大。定義乙個矩陣d用來記錄
所插入點的資訊,d[i,j]表示從vi到vj需要經過的點,初始化d[i,j]=j。把各個頂點插入圖中,比較插點後的距離與原來的距離,
g[i,j] = min( g[i,j], g[i,k]+g[k,j] ),如果g[i,j]的值變小,則d[i,j]=k。在g中包含有兩點之間最短道路的資訊,而在d中則包含了最短通路徑的資訊。
c++實現
#includeusing namespace std;
const int inf = 0x7fffff - 1;
int e[10][10];
int n, m;
int main()
} int src, dst, val;
for (int i = 0; i < m; i++)
//floyd-warshall演算法核心語句
for (int k = 0; k < n; k++)
}} }
for (int i = 0; i < n; i++)
cout << endl;
} return 0;}/*
4 80 1 2
0 2 6
0 3 4
1 2 3
2 0 7
2 3 1
3 0 5
3 2 12
*/
c++實現
#include#includeusing namespace std;
const int inf = 0x7ffffff;
int e[101][101];
int main()
int dst, val;
for (int i = 1; i <= n; i++)
} for (int k = 1; k <= n; k++) }}
} int minn = inf;
for (int i = 1; i <= n; i++)
if (ans < minn)
} cout << pos << " " << minn << endl;
} return 0;
}
程式設計題 比較重量 Floyd演算法實現
內容會持續更新,有錯誤的地方歡迎指正,謝謝 是一種利用鄰接矩陣記錄每兩點間的最短路徑以在沒負迴路的有向圖中找到最短路徑的演算法。求最短路的floyd演算法框架 宣告乙個二維陣列 官方叫 鄰接矩陣 用於將有向圖轉化為這個二維陣列matrix,如何轉化?先將對角線上的元素置0,非對角線上元素置無窮大 再...
C 面試演算法題C 實現
題目一 陣列中查詢 在乙個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。class solution else else return false return false class ...
一種Floyd演算法(弗洛伊德演算法)的C 實現
floyd演算法又稱為插點法,是一種利用動態規劃的思想尋找給定的加權圖中多源點之間最短路徑的演算法。本文給出一種floyd演算法的c 實現。此演算法支援點和邊的動態輸入,並提供介面說明 int d null 二維陣列,儲存任意兩點最短路徑的權值之和 int path null 二維陣列,儲存任意兩點...