家谱树 x

家谱树
【问题描述】
    有个人的家族很大,辈分关系很混乱,请你帮整理一下这种关系。
    给出每个人的孩子的信息。
    输出一个序列,使得每个人的后辈都比那个人后列出。
【输入格式】
    第1行一个整数N(1<=N<=100),表示家族的人数。
    接下来N行,第I行描述第I个人的儿子。
    每行最后是0表示描述完毕。
【输出格式】
    输出一个序列,使得每个人的后辈都比那个人后列出。
    如果有多解输出任意一解。
【输入样例】
    5
    0
    4 5 1 0
    1 0
    5 3 0
    3 0
【输出样例】
    2 4 5 3 1
 
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #define Maxn 101
 6 
 7 using namespace std;
 8 
 9 struct zhan{
10     int z[Maxn],tops;
11     void add(int x)  //进栈操作 
12     {
13         z[++tops]=x;
14     }
15     int duitou()     //返回队头元素 
16     {
17         return z[tops];
18     }
19     void shan()      //删除队头元素 
20     {
21         tops--;
22     }
23     bool kong()      //检验栈是否为空 
24     {
25         return tops == 0 ? 1 : 0;
26     }
27     zhan ()//构造函数(与结构体同名,没有返回值,用于初始化) 
28     {
29         tops=0;
30     }
31 }q;
32 
33 int n,temp,qwq;
34 int du[Maxn],chu[Maxn];
35 int gx[Maxn][Maxn];
36 
37 int main()
38 {
39     char s;
40     scanf("%d",&n);
41     for(int i=1;i<=n;i++)
42     {
43         while(cin>>s)
44         {
45             if(s=='0') break;
46             else
47             {
48                 chu[i]++;             //表示i有chu[i]条出度 
49                 du[s-'0']++;          //s入度++ 
50                 gx[i][chu[i]]=s-'0';  //说明i的第几(chu[i])条出度为s 
51             }
52         }
53     }
54     for(int i=1;i<=n;i++) 
55     {
56         if(!du[i]) q.add(i);   //如果入度为0,进栈 
57     }
58     do
59     {
60         temp=q.duitou();
61         q.shan();
62         cout<<temp<<" ";
63         for(int j=1;j<=chu[temp];j++)
64         {
65             du[gx[temp][j]]--;     //与刚出栈的'temp'有边的入度-- 
66             if(!du[gx[temp][j]]) q.add(gx[temp][j]);//如果这个元素的入度为0,进栈 
67         }
68     }while(!q.kong());  //终止条件 
69     return 0;
70 }

 

posted @ 2017-04-14 16:36  夜雨声不烦  阅读(272)  评论(0编辑  收藏  举报