题意:
给出n个人的师徒关系,判断是否存在即是某个人的师傅又是其徒弟的关系
思路:用拓扑排序判断是否有环
#include<bits/stdc++.h>
#define maxn 1010
using namespace std;
bool G[maxn][maxn];
int in_degree[maxn];
int n,m;
priority_queue<int,vector<int>,greater<int> > q;
int toposort(){
for(int i = 0;i < n; i++){
if(in_degree[i]==0) q.push(i);
}
int c = 0;
while(!q.empty())
{
int v=q.top();
q.pop();
c++;
for(int i = 0; i < n; i++){
if(!G[v][i]){
continue;
}
in_degree[i]--;
if(!in_degree[i])
q.push(i);
}
}
if(c==n)return 1; //判断
else return 0;
}
void init(){
memset(G,0,sizeof(G));
memset(in_degree,0,sizeof(in_degree));
while(!q.empty()) q.pop();
}
int main(){
while(cin>>n>>m){
if(n==0){
break;
}
init();
while(m--){
int x,y;
cin>>x>>y;
if(!G[x][y]) {
G[x][y]=1;
in_degree[y]++;
}
}
if(toposort()) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}