这是B3611 【模板】传递闭包的代码:
#include<bits/stdc++.h>
using namespace std;
const int N=105;
int n;
bitset<N> f[N];
inline int read(){
char ch=getchar();
while((ch^48)&(ch^49)) ch=getchar();
return (ch^48);
}
inline void put(int x){
putchar((x%10)^48);
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) f[i][j]=read();
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
if(f[i][k]) f[i]|=f[k];
}
}
for(int i=1;i<=n;i++,putchar(10)) for(int j=1;j<=n;j++) put(f[i][j]),putchar(32);
return 0;
}
显然,我们可以把外边的 k,i 两重循环优化至 O(m) 级(邻接表,只需处理 f[i][k]=1 的)。
附上 O(wn) 的 bitset 或运算,总时复 O(wnm)?!