直接DFS即可
#include <iostream> #include <string.h> #include <algorithm> #include <cstdio> using namespace std; bool vis[2010]; char map[2010][2010]; struct e{ int u,v; int next; }edge[2050000]; int head[2010],tot; void addedge(int u,int v){ edge[tot].u=u; edge[tot].v=v; edge[tot].next=head[u]; head[u]=tot++; } bool dfs(int now,int parent){ vis[now]=true; for(int e=head[now];e!=-1;e=edge[e].next){ if(vis[edge[e].v]){ if(map[edge[e].v][parent]=='1') return true; } else{ if(dfs(edge[e].v,now)){ return true; } } } return false; } int main (){ int T,n,kase=0; scanf("%d",&T); while(T--){ scanf("%d",&n); getchar(); memset(head,-1,sizeof(head)); memset(vis,false,sizeof(vis)); tot=0; for(int i=0;i<n;i++){ gets(map[i]); for(int j=0;j<n;j++){ if(map[i][j]=='1'){ addedge(i,j); } } } bool flag=false; for(int i=0;i<n;i++){ if(!vis[i]){ flag=dfs(i,-1); if(flag) break; } } if(flag) printf("Case #%d: Yes ",++kase); else printf("Case #%d: No ",++kase); } return 0; }