家谱树(拓扑)

家谱树
【问题描述】
    有个人的家族很大,辈分关系很混乱,请你帮整理一下这种关系。
    给出每个人的孩子的信息。
    输出一个序列,使得每个人的后辈都比那个人后列出。
【输入格式】
    第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 using namespace std;
 3 #define N 1010
 4 int son[N][N];
 5 int n,m;
 6 int stack[N];
 7 int top;
 8 int ru[N];
 9 int main()
10 {
11     cin>>n;
12     for(int i=1;i<=n;++i)
13     {
14         while(cin>>m)
15         {
16             if(m==0)break;
17             son[i][++son[i][0]]=m;
18             ru[m]++;
19         }
20     }
21     for(int i=1;i<=n;++i)
22     if(ru[i]==0)stack[++top]=i;
23     for(int i=1;i<=n;++i)
24     {
25         int d=stack[top--];
26         cout<<d<<" ";
27         for(int j=1;j<=son[d][0];++j)
28         {
29             ru[son[d][j]]--;
30             if(ru[son[d][j]]==0)stack[++top]=son[d][j];
31         }
32     }
33     return 0;
34 }
原文地址:https://www.cnblogs.com/mjtcn/p/6709924.html