(拓扑排序)POJ - 2367 Genealogical tree

Posted tak_fate

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(拓扑排序)POJ - 2367 Genealogical tree相关的知识,希望对你有一定的参考价值。

题意:一个家族里,人物关系很复杂,现在要排序每个人的话语权,要求每个祖先的话语权都要比子孙的高,输出话语权从大到小的顺序。


分析:

原本以为这题有坑,结果随便撸个普通的拓扑序列就A了,好水。

祖先指向子孙,每次取出入度为0即可。


代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <string>
 4 #include <vector>
 5 #include <map>
 6 #include <set>
 7 #include <queue>
 8 #include <cstring>
 9 #include <algorithm>
10 #include <cmath>
11 
12 using namespace std;
13 
14 
15 typedef long long ll;
16 typedef unsigned long long ull;
17 #define inf (0x3f3f3f3f)
18 #define lnf (0x3f3f3f3f3f3f3f3f)
19 #define eps (1e-8)
20 int sgn(double a) {
21     return a < -eps ? -1 : a < eps ? 0 : 1 ;
22 }
23 
24 //---------------------------------------------
25 
26 
27 
28 const int maxn=110;
29 int indu[maxn];
30 vector<int> v[maxn];
31 vector<int> ans;
32 int n;
33 
34 void init() {
35     for(int i=1; i<=n; i++) {
36         v[i].clear();
37     }
38     ans.clear();
39     memset(indu,0,sizeof(indu));
40 }
41 
42 void toposort() {
43     queue<int> q;
44     for(int i=1; i<=n; i++) {
45         if(indu[i]==0) {
46             q.push(i);
47             indu[i]--;
48         }
49     }
50     while(!q.empty()) {
51         int u=q.front();
52         q.pop();
53         ans.push_back(u);
54         for(int i=0; i<v[u].size(); i++) {
55             indu[v[u][i]]--;
56             if(indu[v[u][i]]==0)q.push(v[u][i]);
57         }
58     }
59 
60 }
61 
62 void solve() {
63     while(~scanf("%d",&n)) {
64         init();
65         for(int i=1; i<=n; i++) {
66             int x;
67             while(1) {
68                 scanf("%d",&x);
69                 if(x==0)break;
70                 v[i].push_back(x);
71                 indu[x]++;
72             }
73         }
74         toposort();
75         for(int i=0;i<ans.size()-1;i++){
76             printf("%d ",ans[i]);
77         }
78         printf("%d\n",ans[ans.size()-1]);
79 
80     }
81 
82 }
83 
84 
85 int main() {
86 
87 #ifndef ONLINE_JUDGE
88     freopen("1.in","r",stdin);
89     //freopen("1.out","w",stdout);
90 #endif
91     //iostream::sync_with_stdio(false);
92     solve();
93 }

 

以上是关于(拓扑排序)POJ - 2367 Genealogical tree的主要内容,如果未能解决你的问题,请参考以下文章

POJ 2367:Genealogical tree(拓扑排序)

图论之拓扑排序 poj 2367 Genealogical tree

POJ 2367 Genealogical tree 拓扑排序入门题

POJ2367(拓扑排序裸题

(拓扑排序)POJ - 2367 Genealogical tree

拓扑排序 POJ2367Genealogical tree[topo-sort]