Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 9164 Accepted Submission(s): 4252
We all know a master can have many prentices and a prentice may have a lot of masters too, it's legal. Nevertheless,some cows are not so honest, they hold illegal relationship. Take HH and 3xian for instant, HH is 3xian's master and, at the same time, 3xian is HH's master,which is quite illegal! To avoid this,please help us to judge whether their relationship is legal or not.
Please note that the "master and prentice" relation is transitive. It means that if A is B's master ans B is C's master, then A is C's master.
TO MAKE IT SIMPLE, we give every one a number (0, 1, 2,..., N-1). We use their numbers instead of their names.
If it is legal, output "YES", otherwise "NO".
#include<queue> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define MAXN 100001 using namespace std; int n,m,tot,num,vis[110],into[110]; int to[MAXN],net[MAXN],head[MAXN]; void add(int u,int v){ to[++tot]=v;net[tot]=head[u];head[u]=tot; } int main(){ while(scanf("%d%d",&n,&m)&&n!=0&&m!=0){ tot=0;num=0; memset(to,0,sizeof(to)); memset(net,0,sizeof(net)); memset(into,0,sizeof(into)); memset(head,-1,sizeof(head)); for(int i=1;i<=m;i++){ int x,y; scanf("%d%d",&x,&y); add(x,y); into[y]++; } queue<int>que; for(int i=0;i<n;i++) if(!into[i]){ num++; que.push(i); } while(!que.empty()){ int now=que.front(); que.pop(); for(int i=head[now];i!=-1;i=net[i]){ into[to[i]]--; if(!into[to[i]]){ num++; que.push(to[i]); } } } if(num==n) printf("YES\n"); else printf("NO\n"); } }