warshell算法是用來求關係R的傳遞閉包t(R)的。
傳統的t(R)算法:R+R^2+R^3+.......
當R^n出現循環時,R+R^2+......R^n即爲t(R)
warshell算法:假設存在C作爲中間路徑,取C=0,遍歷關係矩陣M,如果c->i爲1,j->c爲1,那麼Mij=1,c++實現遍歷。
算法複雜度爲O(n^3)
是很菜的算法,如果用來寫算法題還是省省吧,自己理解了就好。
用C語言實現:
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
bool M[100][100];
int n;
int main() {
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>M[i][j];
}
}
for(int c=1;c<=n;c++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
M[i][j]+=M[i][c]*M[c][j];
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cout<<M[i][j]<<" ";
}
cout<<endl;
}
return 0;
}