B3644 【模板】拓扑排序 / 家谱树

题目描述

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

输入格式

11 行一个整数 NN1N1001 \le N \le 100),表示家族的人数。接下来 NN 行,第 ii 行描述第 ii 个人的后代编号 ai,ja_{i,j},表示 ai,ja_{i,j}ii 的后代。每行最后是 00 表示描述完毕。

输出格式

输出一个序列,使得每个人的后辈都比那个人后列出。如果有多种不同的序列,输出任意一种即可。

输入输出样例 #1

输入 #1

5
0
4 5 1 0
1 0
5 3 0
3 0

输出 #1

2 4 5 3 1

#include <bits/stdc++.h>
using namespace std;
int n, m;
const int MAXN = 105;
vector<int> G[MAXN];
int in[MAXN];
vector<int> L;
queue<int> S;
int main()
{
    int n;
    scanf("%d", &n);
    for (int i = 1; i <= n; i++)
    {
        int tmp;
        while (scanf("%d", &tmp) && tmp != 0)
        {
            G[i].push_back(tmp);
            in[tmp]++;
        }
    }
    for (int i = 1; i <= n; i++)
    {
        if (in[i] == 0)
            S.push(i);
    }
    while (!S.empty())
    {
        int u = S.front();
        S.pop();
        L.push_back(u);
        for (auto v : G[u])
        {
            if (--in[v] == 0)
                S.push(v);
        }
    }
    for (int i = 0; i < n; i++)
        printf("%d ", L[i]);
    return 0;
}