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

2021/4/10 18:16:24

本文主要是介绍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;
}
 


这篇关于C++一本通:1351——家谱树的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程