判断是否存在a—>b,b—>c,c—>a这样环的关系,用拓扑排序很好解决
#include<iostream> #include<stdio.h> #include<stack> using namespace std; int n,link[2010]; char map[2010][2010]; int tuopusort() { int num=0; stack<int>q; for(int i=0;i<n;i++) if(link[i]==0) q.push(i); while(!q.empty()) { int u=q.top(); q.pop(); num++; for(i=0;i<n;i++) { if(map[u][i]=='0')continue; if(--link[i]==0) q.push(i); } } if(num==n)return 0; else return 1; } int main() { int i,j,t,op=1; scanf("%d",&t); while(t--) { memset(map,0,sizeof(map)); memset(link,0,sizeof(link)); scanf("%d",&n); getchar(); for(i=0;i<n;i++) { gets(map[i]); for(j=0;j<n;j++) { if(map[i][j]=='1') link[j]++; } } j=tuopusort(); if(j==1)printf("Case #%d: Yes\n",op); else printf("Case #%d: No\n",op); op++; } return 0; }