#P2241. 家谱树.填空题.2

家谱树.填空题.2

题目描述

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

输入格式

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