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