Genealogical tree

一,题目

二,翻译

火星人的血缘关系体系令人困惑。事实上,火星人想在什么时候在什么地方萌芽。他们以不同的群体聚集在一起,因此火星人可以有一个父母,也可以有十个父母。没有人会对一百个孩子感到惊讶。火星人已经习惯了这一点,他们的生活方式似乎很自然。

在行星理事会,令人困惑的家谱系统导致了一些尴尬。那里有最有价值的火星人,因此,为了在所有讨论中不冒犯任何人,人们首先会让年长的火星人发言,而不是让年轻的火星人和最年轻的没有孩子的评估员发言。然而,维护这一订单确实不是一项微不足道的任务。火星人并不总是认识他的所有父母(他的祖父母也没什么好说的!)。但是,如果因为一个错误,第一次说孙子的话,而只说他年轻的曾祖父的话,这是一个真正的丑闻。

你的任务是编写一个程序,它将一劳永逸地定义一个命令,保证安理会的每个成员都比他的每个后代更早发言。

输入

标准输入的第一行仅包含一个数字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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值