FloydWarshall算法求解關係的傳遞閉包(C++實現)
實現代碼
#include<bits/stdc++.h>
using namespace std;
vector< vector<bool> > matrix;
void floydWarshall () {
for (int k = 0; k < matrix.size(); k++) {
for (int i = 0; i < matrix.size(); i++) {
for (int j = 0; j < matrix[i].size(); j++) {
//更新是否存在路徑
matrix[i][j] = matrix[i][j] || (matrix[i][k] && matrix[k][j]);
}
}
}
}
void print() {
for (int i = 0; i < matrix.size(); i++) {
for (int j = 0; j < matrix[i].size(); j++) {
printf("%d ", matrix[i][j] ? 1 : 0);
}
printf("\n");
}
}
int main(int argc, char const *argv[])
{
int N, M;
freopen("floydWarshall.txt", "r", stdin);
while (~scanf("%d%d", &N, &M)) {
matrix.resize(N);
for (int i = 0; i < matrix.size(); i++) {
matrix[i].resize(N);
for (int j = 0; j < matrix[i].size(); j++) {
matrix[i][j] = false;
}
}
for (int i = 0; i < M; i++) {
int row, column;
scanf("%d%d", &row, &column);
matrix[row - 1][column - 1] = true;
}
print();
matrix.clear();
}
return 0;
}
僞代碼
procedure Warshall(MR: n * n的0-1矩陣)
W := MR
for k := 1 to n
for i := n
for j := 1 to n
w[i][j] := w[i][j] V (w[i][k] ^ w[k][j])
return W
- 上述僞代碼參考離散數學及其應用 Kenneth H. Rosen
- 下述樣例參考離散數學及其應用 Kenneth H. Rosen
算法思路
- 與Floy求解有向網、無向網基本相似,將網改成圖,矩陣中的值僅代表是否存在路徑,即可求得關係R的傳遞閉包
- 上述算法時間複雜度O(N ^ 3)
- Floyd算法
輸入數據
3 5
1 1
1 3
2 2
3 1
3 2
輸出結果
1 0 1
0 1 0
1 1 0
鳴謝
感謝離散數學及其應用 Kenneth H. Rosen提供的寶貴思路
最後
- 由於博主水平有限,不免有疏漏之處,歡迎讀者隨時批評指正,以免造成不必要的誤解!