一,题目
![](https://i-blog.csdnimg.cn/blog_migrate/0e5aae4d47cc0bc1590864050d6aeb9f.png)
二,翻译
火星人的血缘关系体系令人困惑。事实上,火星人想在什么时候在什么地方萌芽。他们以不同的群体聚集在一起,因此火星人可以有一个父母,也可以有十个父母。没有人会对一百个孩子感到惊讶。火星人已经习惯了这一点,他们的生活方式似乎很自然。
在行星理事会,令人困惑的家谱系统导致了一些尴尬。那里有最有价值的火星人,因此,为了在所有讨论中不冒犯任何人,人们首先会让年长的火星人发言,而不是让年轻的火星人和最年轻的没有孩子的评估员发言。然而,维护这一订单确实不是一项微不足道的任务。火星人并不总是认识他的所有父母(他的祖父母也没什么好说的!)。但是,如果因为一个错误,第一次说孙子的话,而只说他年轻的曾祖父的话,这是一个真正的丑闻。
你的任务是编写一个程序,它将一劳永逸地定义一个命令,保证安理会的每个成员都比他的每个后代更早发言。
输入
标准输入的第一行仅包含一个数字N,1<=N<=100-火星行星委员会的成员。根据数百年的传统,理事会成员以从1到N的自然数进行计数。此外,只有N行,此外,第I行包含第I位成员的子女列表。子项列表是以空格分隔的任意顺序排列的子项序列号。子项列表可能为空。列表(即使为空)以0结尾。
输出
标准输出应该在其唯一一行中包含一系列发言者的数字,用空格分隔。如果多个序列满足问题的条件,则需要将其中任何一个序列写入标准输出。至少有一个这样的序列始终存在。
三,思路
硬套拓扑排序算法就行
四,代码
#include<deque>
#include<iostream>
using namespace std;
int main()
{
int N, num, indege[1000] = { 0 };
cin >> N;
deque<int> d[1000], que, ans;
for (int i = 1; i <= N; ++i)
while (cin >> num && num != 0)
d[i].push_back(num), ++indege[num];
for (int i = 1; i <= N; ++i)
if (indege[i] == 0)
que.push_back(i);
while (que.size())
{
for (int i = 0; i < d[que.front()].size(); ++i)
if (--indege[d[que.front()][i]] == 0)
que.push_back(d[que.front()][i]);
cout << que.front() << " ", que.pop_front();
}
return 0;
}