题目
#include<bits/stdc++.h>
using namespace std;
int n,a[25][25],cnt,h[25];
struct Graph{
int to,nxt,frm;
}e[1505];
bitset<25>f[16777227];
void add(int u,int v){
cnt++;
e[cnt].frm=u;
e[cnt].to=v;
e[cnt].nxt=h[u];
h[u]=cnt;
}
void dfs(int status,int x){
if(f[status].test(x))return;
f[status].set(x,1);
for(int i=h[x];i;i=e[i].nxt){
int v=e[i].to;
if(!(status&(1<<(e[i].to-1)))&&f[status|(1<<(e[i].to-1))].test(v)==0){
dfs(status|(1<<(e[i].to-1)),v);
}
}
return;
}
signed main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
scanf("%1d",&a[i][j]);
if(a[i][j])add(i,j);
}
}
dfs(1,1);
int mj=(1<<n)-1;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
int flag=0;
for(int k=0;k<=mj;k++){
if(f[k].test(i)&&f[(mj^k)|1].test(j)){
flag=1;
break;
}
}
printf("%d",flag);
}
puts("");
}
}