家谱树
2016-07-17 21:09
246 查看
家谱树
【问题描述】
有个人的家族很大,辈分关系很混乱,请你帮整理一下这种关系。
给出每个人的孩子的信息。
输出一个序列,使得每个人的后辈都比那个人后列出。
【输入格式】
第1行一个整数N(1<=N<=100),表示家族的人数。
接下来N行,第I行描述第I个人的儿子。
每行最后是0表示描述完毕。
【输出格式】
输出一个序列,使得每个人的后辈都比那个人后列出。
如果有多解输出任意一解。
【输入样例】
5
0
4 5 1 0
1 0
5 3 0
3 0
【输出样例】
2 4 5 3 1
【问题描述】
有个人的家族很大,辈分关系很混乱,请你帮整理一下这种关系。
给出每个人的孩子的信息。
输出一个序列,使得每个人的后辈都比那个人后列出。
【输入格式】
第1行一个整数N(1<=N<=100),表示家族的人数。
接下来N行,第I行描述第I个人的儿子。
每行最后是0表示描述完毕。
【输出格式】
输出一个序列,使得每个人的后辈都比那个人后列出。
如果有多解输出任意一解。
【输入样例】
5
0
4 5 1 0
1 0
5 3 0
3 0
【输出样例】
2 4 5 3 1
#include<cstdio> #include<cstring> using namespace std; int n,i,u,map[110][110],in[110]/*入度*/,q[110],head=0,tail=0,b; void wt() { memset(in,0,sizeof(0)); memset(map,0,sizeof(map)); scanf("%d",&n); for(i=1;i<=n;i++) { while(scanf("%d",&b)&&b) { map[b][i]=1;//b是i的儿子 in[i]++;//记录i的入度 } } for(i=1;i<=n;i++) if(in[i]==0) q[tail++]=i;//把入度为零的点/把没有儿子的人扔进队列里去 while(head!=tail) { u=q[head++]; for(i=1;i<=n;i++) if(map[u][i]==1) { map[u][i]=0;//循环一遍 把u扔出去把他父亲的入度减一 in[i]--; if(in[i]==0)q[tail++]=i;//又找到入度为0的点 //相当于u不在了,新找到的点是没有孩子的人加入队列 //孩子越多或者孩子的孩子越多的人越在后面入队 } //循环往复 一点点的把没有孩子的人加入队列 } for(i=n-1;i>=0;i--)printf("%d ",q[i]);//倒序输出即可 } int main() { wt(); return 0; }
相关文章推荐
- AOV网络与拓扑(一)
- AOV网络与拓扑(二)——实现
- POJ1094-Sorting It All Out 拓扑排序
- AOV图-AOE图
- Aov网络与拓补排序的实现
- 有向无环图:AOV网与AOE网
- 拓扑排序(java)
- 图--AOV网络与拓扑排序
- 单因素方差分析(aov)-R版本
- HTML中Select的使用详解
- 顺序存储结构与链式存储结构的比较(也可以说的顺序表与链表的比较)
- 面试相关
- nyoj 1276 && 河南省第九届ACM竞赛E题
- 格式化数字的方法
- linux中的top命令详解
- c++22、string虚假泄露问题,以及简单string类实现
- Android 实现图形解锁
- MD5加密工具类
- Live Archive 3177 - Beijing Guards 二分+贪心
- linux命令man、info、pinfo