题目大意:给出n个人之间的m对师徒关系,让判断是否合法;其中:AB不合法当且仅当A是B的师傅且B是A的师傅。
说白了就是拓扑排序判环问题,对于给出的n个人作为图G的n个顶点,他们之间的关系看做是有向边,对于有向图G来说,如果拓扑序列存在,那么就说明这n个人之间的师徒关系合法,否则不合法。
代码如下:用了vector和queue类
#include <cstdio>
#include <vector>
#include <queue>
#include <iostream>
#include <cstring>
using namespace std;
vector <int> edge[101];
int ind[101];
void Top_sort(int n)
{
queue <int> q;
int sum=n;
for(int i=0;i<n;i++)
if(ind[i]==0)
q.push(i);
while(!q.empty())
{
sum--;
int tmp=q.front();
q.pop();
for(int k=0;k<edge[tmp].size();k++)
{
ind[edge[tmp][k]]--;
if(ind[edge[tmp][k]]==0)
q.push(edge[tmp][k]);
}
}
if(sum) puts("NO");
else puts("YES");
}
int main()
{
int n,m,a,b;
while(scanf("%d%d",&n,&m)&&m)
{
memset(ind,0,sizeof(ind));
for(int i=0;i<n;i++)
edge[i].clear();
for(int i=0;i<m;i++)
{
scanf("%d%d",&a,&b);
edge[a].push_back(b);
ind[b]++;
}
Top_sort(n);
}
return 0;
}