暴力+BFS 水过
#include<iostream> #include<cstdio> #include<cstring> const int N=2000+5; inline int read(){ int f=1,x=0; char c=getchar(); while (c<'0'||c>'9'){if (c=='-') f=-1;c=getchar();} while (c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();} return f*x; } struct Edge{int to,next;}e[N*N]; int head[N],ans,T,cnt,vis[N]; inline void ins(int u,int v){ cnt++;e[cnt].to=v;e[cnt].next=head[u];head[u]=cnt; } inline void dfs(int u){ vis[u]=T;ans++; for(int i=head[u];i;i=e[i].next){ int v=e[i].to; if(vis[v]==T)continue; vis[v]=T; dfs(v); } } char b[N]; int main(){ int n;n=read(); for(int i=1;i<=n;i++){ scanf("%s",b+1); for(int j=1;j<=n;j++) if(b[j]-'0')ins(i,j); } for(int i=1;i<=n;i++){ T++; dfs(i); } printf("%d",ans); return 0; }