题目来自:http://ybt.ssoier.cn:8088/problem_show.php?pid=1351
【题目描述】
有个人的家族很大,辈分关系很混乱,请你帮整理一下这种关系。
给出每个人的孩子的信息。
输出一个序列,使得每个人的后辈都比那个人后列出。
【输入】
第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
作者分析:这题本该用拓扑排序,但我使用了递归的形式,数组a储存每个人的孩子,vis数组检查是否遍历过,采用栈的形式输出解。
#include <iostream> #include <stack> #include <cstring> using namespace std; stack<int> ans; int a[101][101],n,t,answer[101]; bool vis[101]; void search(int x){ if (vis[x]) return; vis[x] = true; if (a[x][1] == 0){ ans.push(x); return; } for (int i = 1;i <= n;i++){ if (a[x][i] == 0) break; search(a[x][i]); } ans.push(x); return; } int main(){ memset(vis,false,sizeof(vis)); cin >> n; for (int i = 1;i <= n;i++){ t = 1; do{ cin >> a[i][t]; t++; }while (a[i][t-1] != 0); } for (int i = 1;i <= n;i++) search(i); for (int i = 1;i <= n;i++){ if (ans.empty()) break; answer[i] = ans.top(); ans.pop(); } for (int i = 1;i <= n;i++) cout << answer[i] << " "; return 0; }