题目来源:http://acm.hdu.edu.cn/php?pid=3342
题意
在一个ACM群里,存在师傅和徒弟这两种关系,现给出m组的关系,左边的是右边的师傅,那么问,这些关系是够合法。也就是不能够出现悖论。
思路
简单的拓扑排序一下,按照一定的关系,可以验证是否有环的存在。
代码
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m;
int mp[104][105];
int degre[105];
int vis[104];
bool flag;
void dfs()
{
int k=-1;
for(int i=0; i<n; i++)
{
if(degre[i]==0)
{
k=i;
degre[i]=-1;
break;
}
}
if(k==-1)
{
return ;
}
for(int i=0; i<n; i++)
{
if(mp[i][k]&°re[i]!=-1)
{
degre[i]--;
}
}
dfs();
}
int main()
{
while(~scanf("%d",&n)&&n)
{
scanf("%d",&m);
memset(degre,0,sizeof(degre));
memset(vis,0,sizeof(vis));
memset(mp,0,sizeof(mp));
for(int i=1; i<=m; i++)
{
int u,v;
scanf("%d%d",&u,&v);
if(mp[v][u])
continue;
mp[v][u]=1;
degre[v]++;
}
flag=0;
dfs();
for(int i=0; i<n; i++)
{
if(degre[i]!=-1)
{
flag=1;
break;
}
}
puts(flag?"NO":"YES");
}
}