首页 > 代码库 > (拓扑排序)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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。