#P2240. 家谱树.填空题.1

家谱树.填空题.1

题目描述

有个人的家族很大,辈分关系很混乱,请你帮整理一下这种关系。给出每个人的后代的信息。输出一个序列,使得每个人的后辈都比那个人后列出。

输入格式

11 行一个整数 NN1N1001 \le N \le 100),表示家族的人数。接下来 NN 行,第 ii 行描述第 ii 个人的后代编号 ai,ja_{i,j},表示 ai,ja_{i,j}ii 的后代。每行最后是 00 表示描述完毕。

输出格式

输出一个序列,使得每个人的后辈都比那个人后列出。如果有多种不同的序列,输出任意一种即可。

样例

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) }}