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——家谱树的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享