hdu3342 拓扑序

题意:一个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
");
46         else printf("NO
");
47     }
48     return 0;
49 }
View Code
原文地址:https://www.cnblogs.com/cenariusxz/p/4794948.html