题意:n个人有m个师徒关系,每个人可以有多个徒弟,也可以有多个老师,但任两个人之间不能互为老师,且师徒关系是可传递的。
解法:floyd求传递闭包,f[i][j]表示第i个人和第j个人是否存在师徒关系,若f[i][j]==f[j][i]==1则二人互为老师,即关系不合法。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 105;
int f[maxn][maxn];
int n,m;
void floyd(){
for(int k = 0 ; k < n; ++k){
for(int i = 0; i < n; ++i){
for(int j = 0; j < n; ++j){
f[i][j] = f[i][j] || (f[i][k] && f[k][j]);
}
}
}
}
bool check(){
for(int i = 0; i < n; ++i){
for(int j = i+1; j < n; ++j){
if(f[i][j] == 1 && f[j][i] == 1)
return false;
}
}
return true;
}
int main(){
while(~scanf("%d%d",&n,&m)){
if(!n) break;
memset(f,0,sizeof(f));
int a,b;
for(int i = 0; i < m; ++i){
scanf("%d%d",&a,&b);
f[a][b] = 1;
}
floyd();
if(check()) printf("YES\n");
else printf("NO\n");
}
return 0;
}