FloydWarshall算法求解關係的傳遞閉包(C++實現)

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

算法思路

  • 與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提供的寶貴思路

最後

  • 由於博主水平有限,不免有疏漏之處,歡迎讀者隨時批評指正,以免造成不必要的誤解!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章