题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4324
#include <stdio.h>
#include <string.h>
#define MAXN 2002
int indegree[MAXN];
char mp[MAXN][MAXN];
int main()
{
int n,i,j,k,flag,test,cases=1;
scanf("%d",&test);
while(test--)
{
flag=0;
memset(indegree,0,sizeof(indegree));
scanf("%d",&n);
for(i=0;i<n;++i)
{
scanf("%s",mp[i]);
for(j=0;j<n;++j)
{
if(mp[i][j]=='1')
indegree[j]++;
}
}
for(i=0;i<n;++i)
{
for(j=0;j<n;++j)
{
if(indegree[j]==0)
break;//找出入度为0的点
}
if(j==n)
{
flag=1;//任何一个节点入度都不为0,存在环
break;
}
else
{
indegree[j]--;//删除当前节点
for(k=0;k<n;++k)
{
if(mp[j][k]=='1')
indegree[k]--;
}
}
}
if(flag)
printf("Case #%d: Yes\n",cases++);
else
printf("Case #%d: No\n",cases++);
}
return 0;
}