家谱树(信息学奥赛一本通 1351)

Posted ljy-endl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了家谱树(信息学奥赛一本通 1351)相关的知识,希望对你有一定的参考价值。

【问题描述】

有个人的家族很大,辈分关系很混乱,请你帮整理一下这种关系。 给出每个人的孩子的信息。 输出一个序列,使得每个人的后辈都比那个人后列出。

【输入格式】

第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


拓扑排序算法

【stack】

 1 #include<cstdio>
 2 #include<iostream>
 3 using namespace std;
 4 int a[101][101],c[101],r[101],ans[101];
 5 int i,j,tot,temp,num,n,m;
 6 int main()
 7  
 8     cin >> n;
 9     for (i = 1; i <= n; i++)
10     
11         do
12         
13             cin >> j;
14             if (j !=0 )
15             
16                 c[i]++;                //c[i]用来存点i的出度 计数
17                 a[i][c[i]] = j;
18                 r[j]++;                //r[j]用来存点j的入度。
19                
20         
21         while (j != 0);
22     
23 for (i = 1; i <= n; i++)
24         if (r[i] == 0)
25             ans[++tot] = i;          //把图中所有入度为0的点入栈,栈用一维数组ans[]表示
26     do
27     
28         temp = ans[tot];
29         cout << temp << " ";
30         tot--; num++;                 //栈顶元素出栈并输出
31         for (i = 1; i <= c[temp]; i++)
32         
33             r[a[temp][i]]--;
34             if (r[a[temp][i]] == 0) //如果入度减1后变成0,则将这个后继点入栈
35                 ans[++tot] = a[temp][i];
36              
37     
38     while (num != n); //tot>0        //如果输出的点的数目num等于n,说明算法结束
39     return 0;
40 

【Vector + queue】

技术图片

 

以上是关于家谱树(信息学奥赛一本通 1351)的主要内容,如果未能解决你的问题,请参考以下文章

信息学奥赛一本通为啥不通过

长春市哪里有卖这本信息学奥赛一本通c++的书店?

信息奥赛一本通 1060:均值

一道信息学奥赛NOIP提高组难度的题

[信息学奥赛一本通oj1741]电子速度 题解

信息学奥赛一本通 1.2 二分与三分