【题目描述】
有个人的家族很大,辈分关系很混乱,请你帮整理一下这种关系。
给出每个人的孩子的信息。
输出一个序列,使得每个人的后辈都比那个人后列出。
【输入】
第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; }