因为每两个点一定有且仅有一条指向边,那么先假定点按顺序1,2,....n,每个点一定指向后面的点,即1指向2,3,4.....n,2指向3,4,5....n。。。。。那么
每个点的出度分别为n-1,n-2,n-3,....0,而此时任意反向一条边都能够得到一个环,因为反向了一条边,则这条边的两个的出度一个加1一个减1,使得所
有点中一定存在两个点的出度相同。那么对于其他有向图都可以由【元图】反向某些边得到,所以只要用反证法,如果所有点里面没有两个点的出度
相同则肯定不存在环,否则存在。时间复杂度O(n);
对于判断一个图中是否存在两点的出度相同,本问题很简单,对于图中我们先用一个数组统计每个点的出度大小,然后排序,然后就可以看是否存在相
邻的两个数组值是否相等就行了。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int N=2500;
int out[N];
char str[N][N];
int main()
{
int i,j,k,n,m,T;
scanf("%d",&T);
char c;
int t=1;
while(T--)
{
scanf("%d",&n);
memset(out,0,sizeof(out));
for(i=0;i<n;i++)
scanf("%s",str[i]);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(str[i][j]=='1')
out[i]++;
sort(out,out+n);
bool flag=false;
for(i=0;i<n-1;i++)
{
if(out[i]==out[i+1])
{
flag=true;
break;
}
}
printf("Case #%d: ",t++);
printf("%s\n",flag?"Yes":"No");
}
return 0;
}