拓扑排序算法实践:家谱树

家谱树
【问题描述】
有个人的家族很大,辈分关系很混乱,请你帮整理一下这种关系。给出每个人的孩子的信息。
输出一个序列,使得每个人的后辈都比那个人后列出。

【输入格式】

第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

解决方法:

拓扑排序是对有向无环图上点的排序,使得对于每一条有向边上的两个点,前一个点的次序一定比后一个点的次序优先,也就是严格满足先后关系。

由于要输出的家族辈分为递减次序,因此可采用拓扑排序。

先输入家谱树,构造入度集和边集,编写函数first查找输入的某成员的最后一个后代,函数next从后往前遍历该成员的其他后代。在用拓扑排序解决问题时,可以先建立一个队列,队列存放辈分最大的成员,也就是入度为0的成员。该成员弹出队列后,就将该成员的后代入度都减去1,然后再在他的后代中找出入度为0的后代,循环往复地遍历这个过程。

代码如下:

#include<iostream>
#include<vector>
#include<queue>
using namespace std;
void fami
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值