这是一道拓扑排序的题,题意下面代码注释部分有,所以就说一下思路,只用看最后的关系是不是合法的,判断方法就是入度为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
*/