C++一本通:1351——家谱树

题目来自: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;
}
 
上一篇:《算法竞赛进阶指南》 第一章 AcWing 101. 最高的牛 配图 差分


下一篇:C# List泛型集合中的GroupBy<>用法