zoukankan      html  css  js  c++  java
  • (拓扑排序)POJ

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


    分析:

    原本以为这题有坑,结果随便撸个普通的拓扑序列就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 }
  • 相关阅读:
    memcpy源代码
    XML总结
    javabean总结
    VC++注射过程
    八排序算法
    fscanf功能具体解释
    外行观察者模式
    Android 实现用户列表信息的功能,然后选择删除幻灯片删除功能
    WINHTTP的API接口说明
    poj 1698 Alice&#39;s Chance 拆点最大流
  • 原文地址:https://www.cnblogs.com/tak-fate/p/6017246.html
Copyright © 2011-2022 走看看