Warshell传递闭包算法
方法:动态规划
思路:动态规划将问题分段,通过一系列n阶矩阵r(k)来构造最终阶段n阶 传递闭包矩阵r(n)
r(0)–没有中间节点,是原矩阵
r(1)–中间有一个节点(第一个节点)
r(2)–中间有两个结点(前两个节点)
r(n)–中间有n个节点
注意:在最外层循环一次后,要及时更新矩阵,以便后续矩阵的计算
#include<iostream>
using namespace std;
const int maxn=100;
int a[maxn][maxn];
int b[maxn][maxn];
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>a[i][j];
}
}
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
b[i][j]=a[i][j]||(a[i][k]&a[k][j]);
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
a[i][j]=b[i][j];
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cout<<b[i][j]<<" ";
}
cout<<"\n";
}
}