A - Jin Yong’s Wukong Ranking List

链接:https://vjudge.net/contest/394916#problem/A

题意:给出一些人的武功高低,具有传递性即A>B,B>C推出A>C,判断第一个出现矛盾的人若没有输出0

思路:用拓扑排序判断是否无环即可,有环证明矛盾

因为评测机出了问题(提交了都是wa,用博客上的代码也是wa),所以直接用他人博客的代码

 1 #include<iostream>
 2 #include<deque>
 3 #include<memory.h>
 4 #include<stdio.h>
 5 #include<map>
 6 #include<string>
 7 #include<algorithm>
 8 #include<vector>
 9 #include<math.h>
10 #include<stack>
11 #include<queue>
12 #include<bitset>
13 #include<set>
14 #define INF (0x3f3f3f3f)
15 using namespace std;
16 typedef long long int ll;
17 const int MAXN=10010;
18  
19 map<string,int> mp;
20 int cnt=0;
21  
22 vector<int> G[MAXN];
23  
24 int degree[MAXN];
25  
26 int deg[MAXN];
27  
28 bool topo(){
29     
30     queue<int> que;
31     
32     for(int i=1;i<=cnt;i++){
33         deg[i]=degree[i];
34     }
35     
36     int num=0;
37     for(int i=1;i<=cnt;i++){
38         if(deg[i]==0){
39             que.push(i);
40             num++;
41         }
42     }
43     
44     while(!que.empty()){
45         int tp=que.front();
46         que.pop();
47         for(int i=0;i<G[tp].size();i++){
48             deg[G[tp][i]]--;
49             if(deg[G[tp][i]]==0){
50                 que.push(G[tp][i]);
51                 num++;
52             }
53         }
54     }
55     
56     if(num==cnt)
57         return false;
58     return true;
59 }
60  
61 int main(){
62     
63     int N;
64     while(~scanf("%d",&N)){
65         cnt=0;
66         for(int i=1;i<=2*N;i++){
67             G[i].clear();
68             degree[i]=0; 
69         }
70         mp.clear();
71         
72         bool flag=0;
73         for(int i=0;i<N;i++){
74             string a,b;
75             cin>>a>>b;
76             if(mp[a]==0)
77                 mp[a]=++cnt;
78             if(mp[b]==0)
79                 mp[b]=++cnt;
80             
81             G[mp[a]].push_back(mp[b]);
82             degree[mp[b]]++;
83             
84             if(flag==0&&topo()){
85                 cout<<a<<" "<<b<<endl;
86                 flag=1;
87             }
88         }
89         if(flag==0)
90             cout<<0<<endl;
91         
92     }
93     
94     
95     return 0;
96 }
97  
98  
99  

 

posted @ 2020-09-26 22:39  古比  阅读(180)  评论(0编辑  收藏  举报