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;
}