- BC20280018's blog
拓扑排序模板
- 2025-9-14 12:01:32 @
B3644 【模板】拓扑排序 / 家谱树
题目描述
有个人的家族很大,辈分关系很混乱,请你帮整理一下这种关系。给出每个人的后代的信息。输出一个序列,使得每个人的后辈都比那个人后列出。
输入格式
第 行一个整数 (),表示家族的人数。接下来 行,第 行描述第 个人的后代编号 ,表示 是 的后代。每行最后是 表示描述完毕。
输出格式
输出一个序列,使得每个人的后辈都比那个人后列出。如果有多种不同的序列,输出任意一种即可。
输入输出样例 #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;
}