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