题意:n个点的完全有向图,问是否存在三角有向环
思路分析:好题 ! 这题很容易因为没看清题目导致理解有问题,注意看题。如果图中有有向环,那么肯定有三角有向
环,这个是可以证明的,因此这题只要判断有无有向环就可以了。用拓扑排序可以判断。
拓扑排序判环:先求出每个结点的入度,每次找一个出度为0的结点,然后减去它的出边对应顶点的入度,如果能找到n个入度为0的点,那么无环;否则有环。
代码如下:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<stack>
#include<queue>
#include<set>
#include<map>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define N 2005
#define inf 0x7ffffff
#define eps 1e-9
#define pi acos(-1.0)
using namespace std;
char s[N][N];
int a[N],vis[N];
int tuopu(int n)
{
memset(vis,0,sizeof(vis));
int i,j,k;
int cnt = 0;
for(i = 0; i < n; i++)
{
for(j = 0; j < n; j++)
if(a[j] == 0 && !vis[j])
break;
if(j == n) return 1;
vis[j] = 1;
for(k = 0; k < n; k++)
if(s[j][k] == '1')
a[k]--;
}
return 0;
}
int main()
{
//freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);
int t,cas = 1;
scanf("%d",&t);
while(t--)
{
memset(a,0,sizeof(a));
int n,i,j;
scanf("%d",&n);
for(i = 0; i < n; i++)
scanf("%s",s[i]);
for(i = 0; i < n; i++)
for(j = 0; j < n; j++)
if(s[i][j] == '1')
a[j]++;
printf("Case #%d: ",cas++);
if(tuopu(n)) printf("Yes\n");
else printf("No\n");
}
return 0;
}