首页 > 代码库 > (拓扑排序)POJ - 2367 Genealogical tree

(拓扑排序)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_JUDGE88     freopen("1.in","r",stdin);89     //freopen("1.out","w",stdout);90 #endif91     //iostream::sync_with_stdio(false);92     solve();93 }

 

(拓扑排序)POJ - 2367 Genealogical tree