题意:一个家族里,人物关系很复杂,现在要排序每个人的话语权,要求每个祖先的话语权都要比子孙的高,输出话语权从大到小的顺序。
分析:
原本以为这题有坑,结果随便撸个普通的拓扑序列就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 ",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 }