这是一道拓扑排序的题,题意下面代码注释部分有,所以就说一下思路,只用看最后的关系是不是合法的,判断方法就是入度为0的个数等于n就说明没有成环否则就有环存在。可以定义一个sum来计数,每入队一次就说明有一个入度为0的点,所以sum加1,最后sum和n比较,相同就是YES,否则NO。如果不会用优先队列实现的可以去看这篇博客确定比赛名次
AC代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
using namespace std;
const int MAXN = 105;
bool vis[MAXN][MAXN];
int dep[MAXN];
int n,m;
int w,l,sum;
priority_queue<int,vector<int> >q;
void TopoSort(int n){
for(int i=0;i<n;i++){
if(!dep[i]){q.push(i);sum++;} // 每入队一次sum就加1
}
while(!q.empty()){
int ans = q.top();
q.pop();
for(int i=0;i<n;i++){
if(vis[ans][i]){
if(--dep[i]==0){
q.push(i);
sum++;
}
}
}
}
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF){
if(n==0&&m==0) break;
memset(vis,0,sizeof(vis));
memset(dep,0,sizeof(dep));
for(int i=0;i<m;i++){
scanf("%d%d",&w,&l);
if(!vis[w][l]){
vis[w][l] = 1;
dep[l]++;
}
}
sum = 0;
TopoSort(n);
if(sum==n) printf("YES\n");
else printf("NO\n");
}
return 0;
}
/***
[来源] HDU 3342
[题目] Legal or Not
[大意]
有一群人要建立师徒关系,当然有些情况是不能满足的,比如A是B的师父,B又是A的师父,这显然是错的
所以这道题就是让你判断最后形成的关系网是否是正确的。
[输入]
3 2
0 1
1 2
2 2
0 1
1 0
0 0
[输出]
YES
NO
*/