#P2241. 家谱树.填空题.2
家谱树.填空题.2
题目描述
有个人的家族很大,辈分关系很混乱,请你帮整理一下这种关系。给出每个人的后代的信息。输出一个序列,使得每个人的后辈都比那个人后列出。
输入格式
第 行一个整数 (),表示家族的人数。接下来 行,第 行描述第 个人的后代编号 ,表示 是 的后代。每行最后是 表示描述完毕。
输出格式
输出一个序列,使得每个人的后辈都比那个人后列出。如果有多种不同的序列,输出任意一种即可。
样例
5
0
4 5 1 0
1 0
5 3 0
3 0
2 4 5 3 1
完成程序
#include<bits/stdc++.h>
using namespace std;
int n,id;
struct Edge{
int v,next;
}e[10000];
int in_d[101],h[101];
void add(int u,int v){
// 链式前向星存储变
e[++id] = {__填空(1)__};
h[u] = __填空(2)__;
}
queue <int> q;
void topo_sort(){ // 本质上,这是一个 BFS 算法的函数
for(int u=1;u<=n;u++){
if(__填空(3)__) q.push(u);
// 如果一个点的入度为 0 ,而且还没处理过,就把这个顶点放入队列
// 队列里面的顶点都是可以输出的
}
int u,v;
while(q.size()){
// 从队列中拿出这些入度为 0 的顶点,输出,并且以它们为出发,找到从他们出发的边,让这些边的端点的入度减少 1
u = q.front();
q.pop();
printf("%d ",u);
for(int i=__填空(4)__;i;i=__填空(5)__){
v = __填空(6)__;
__填空(7)__; // 入度调整
if(!in_d[v]) q.push(v);
}
}
}
int main(){
scanf("%d",&n);
int v;
for(int u=1;u<=n;u++){
scanf("%d",&v);
while(v){
__填空(8)__;// 建边
in_d[v]++;
scanf("%d",&v);
}
}
topo_sort(); // 拓扑排序函数
return 0;
}
填空(1): {{ input(1) }}
填空(2): {{ input(2) }}
填空(3): {{ input(3) }}
填空(4): {{ input(4) }}
填空(5): {{ input(5) }}
填空(6): {{ input(6) }}
填空(7): {{ input(7) }}
填空(8): {{ input(8) }}