标签:
题意:一个QQ群里面有一群大神,他们互相帮助解决问题,然后互相膜拜,于是有些人就称别人是他师父,现在给出很多师徒关系,问是否有矛盾
拓扑序,按师徒关系建边直接拓扑序就行了。
1 #include<stdio.h>
2 #include<string.h>
3 #include<queue>
4 using namespace std;
5 const int maxm=105;
6
7 int id[maxm],n;
8 int head[maxm],point[maxm],nxt[maxm],size;
9
10 void add(int a,int b){
11 point[size]=b;
12 nxt[size]=head[a];
13 head[a]=size++;
14 id[b]++;
15 }
16
17 bool topo(){
18 queue<int>q;
19 for(int i=0;i<n;++i)if(!id[i])q.push(i);
20 int cnt=0;
21 while(!q.empty()){
22 int u=q.front();q.pop();
23 cnt++;
24 for(int i=head[u];~i;i=nxt[i]){
25 int j=point[i];
26 id[j]--;
27 if(!id[j])q.push(j);
28 }
29 }
30 if(cnt==n)return 1;
31 return 0;
32 }
33
34 int main(){
35 int m;
36 while(scanf("%d%d",&n,&m)!=EOF&&(n||m)){
37 memset(id,0,sizeof(id));
38 memset(head,-1,sizeof(head));
39 size=0;
40 while(m--){
41 int a,b;
42 scanf("%d%d",&a,&b);
43 add(a,b);
44 }
45 if(topo())printf("YES\n");
46 else printf("NO\n");
47 }
48 return 0;
49 }
标签:
原文地址:http://www.cnblogs.com/cenariusxz/p/4794948.html