正解是tarjan强联通缩点,然而我意外地发现Floyd压位轻松过
#include <cstdio> unsigned f[2000][63]; int N; int gc() { char c=getchar(); while (c!='0'&&c!='1') c=getchar(); return (int)c-48; } int count(unsigned x) { int res=0; while (x) res++,x&=(x-1); return res; } int main() { scanf("%d",&N); for (int i=0;i<N;i++) { for (int j=0;j<N;j++) { int t=gc(); if (t) f[i][j/32]|=(1<<(j%32)); } f[i][i/32]|=(1<<(i%32)); } for (int k=0;k<N;k++) for (int i=0;i<N;i++) if ((f[i][k>>5]>>(k&31))&1) for (int j=0;j<=(N-1)>>5;j++) f[i][j]|=f[k][j]; int OUT=0; for (int i=0;i<N;i++) for (int j=0;j<=(N-1)/32;j++) OUT+=count(f[i][j]); printf("%d\n",OUT); return 0; }