家谱树
【问题描述】
有个人的家族很大,辈分关系很混乱,请你帮整理一下这种关系。给出每个人的孩子的信息。
输出一个序列,使得每个人的后辈都比那个人后列出。
【输入格式】
第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 family_tree(vector<vector<int>>&edge,int n,vector<int>&indegree) {//生成家谱树
int descent;//后代
for (int i = 0; i < n; i++) {
while (cin >> descent && descen