题意:输入n和m,表示有n个人,m对“师傅-徒弟”对应关系,接下来的m行输入“师傅 徒弟",当n=0,m=0时break
要判断每一组样例里的关系是否合法,例如“A B”“B A”这样的关系就是不合法的,且该关系具有传递性,“A B”“B C"可以得到”A C"。若合法,输出“YES",否则,输出”NO“
思路:判断有环还是无环,用拓扑排序
#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
const int MAXN=101;
using namespace std;
vector<int> graph[MAXN];
int inDegree[MAXN];
bool TopologicalSort(int n){
queue<int> q;
for(int i=0;i<n;i++){ //入度为0放入队列
if(inDegree[i]==0){
q.push(i);
}
}
int number=0; //存储入度为0的点的个数
while(!q.empty()){
int u=q.front();
q.pop();
number++;
for(int i=0;i<graph[u].size();i++){ //该点出队列要将他所有相连的点入度减一
int v=graph[u][i];
inDegree[v]--;
if(inDegree[v]==0){
q.push(v);
}
}
}
return n==number; //若无环,应相等
}
int main(){
int n,m;
while(scanf("%d%d",&n,&m)!=EOF){
if(n==0&&m==0){
break;
}
memset(inDegree,0,sizeof(inDegree));
memset(graph,0,sizeof(graph));
while(m--){
int x,y;
scanf("%d%d",&x,&y);
graph[x].push_back(y);
inDegree[y]++;
}
if(TopologicalSort(n)){
printf("YES\n");
}
else{
printf("NO\n");
}
}
return 0;
}