1351:【例4-12】家谱树
【题目描述】
有个人的家族很大,辈分关系很混乱,请你帮整理一下这种关系。
给出每个人的孩子的信息。
输出一个序列,使得每个人的后辈都比那个人后列出。
【输入】
第1行一个整数NN(1≤N≤1001≤N≤100),表示家族的人数;
接下来NN行,第ii行描述第ii个人的儿子;
每行最后是00表示描述完毕。
【输出】
输出一个序列,使得每个人的后辈都比那个人后列出;
如果有多解输出任意一解。
【输入样例】
5 0 4 5 1 0 1 0 5 3 0 3 0
【输出样例】
2 4 5 3 1
#include <bits/stdc++.h>
using namespace std;
void show(vector<vector<int>> &a)
{
for (int i = 1; i < a.size(); i++) {
cout << i << ": ";
for (int j = 0; j < a[i].size(); j++) {
cout << a[i][j] << " ";
}
cout << endl;
}
}
void show(vector<int> &a)
{
for (int i = 1; i < a.size(); i++) {
cout << a[i] << " ";
}
cout << endl;
}
vector<int> topo(vector<vector<int>> &a)
{
vector<int> ans;
vector<bool> visited(a.size());
while (ans.size() < a.size() - 1) {
vector<int> inDeg(a.size()); // 入度
for (int i = 1; i < a.size(); i++) {
if (visited[i]) {
continue;
}
for (int j = 0; j < a[i].size(); j++) {
inDeg[a[i][j]] += 1;
}
}
// show(inDeg);
for (int i = 1; i < inDeg.size(); i++) {
if (visited[i]) {
continue;
}
if (inDeg[i] == 0) {
ans.push_back(i);
visited[i] = true;
}
}
}
return ans;
}
int main()
{
// freopen("in.txt", "r", stdin);
int n; // n行
scanf("%d", &n);
// cout << n << endl;
vector<vector<int>> a(n + 1); // 邻接表
for (int i = 1; i < a.size(); i++) {
for (;;) {
int x;
scanf("%d", &x);
if (x == 0) {
break;
}
a[i].push_back(x);
}
}
// show(a);
vector<int> ans = topo(a);
for (auto &a : ans) {
printf("%d ", a);
}
return 0;
}
浙公网安备 33010602011771号