YCOJ家谱

这篇博客介绍了YCOJ家谱的树形结构,并提及这是一种图的遍历问题,相关算法将在图和树基础中详细讲解。文章包含具体的源代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:
Description

家谱:又称族谱、宗谱等。是一种以表谱形式,记载一个家族的世系繁衍及重要人物事迹的书。皇帝的家谱称玉牒,如新朝玉牒、皇宋玉牒。它以记载父系家族世系、人物为中心,由正史中的帝王本纪及王侯列传、年表等演变而来。

家谱是一种特殊的文献,就其内容而言,是中国五千年文明史中具有平民特色的文献,记载的是同宗共祖血缘集团世系人物和事迹等方面情况的历史图籍。家谱属珍贵的人文资料,对于历史学、民俗学、人口学、社会学和经济学的深入研究,均有其不可替代的独特功能。

这一天小白拿到了自己家的家谱,小白便想知道自己家的家谱中,每位祖先有多少孩子(他孩子的孩子也是他的孩子)。但是家族历史源远流长,家谱实在太庞大了,自己一个人完全数不过来。热心的你便自告奋勇帮小白写一个程序,来统计每位祖先他有多少孩子。


Input

输入的第一行有一个整数 n(1 ≤ n ≤ 100000),表示家谱中总共的人数。

然后有 n-1行,每行有两个整数 x(1 ≤ x ≤ n), y(1 ≤ y ≤ n)表示 x 是 y 的父亲。


Output

输出 n 行,每行有一个整数,表示第 i 个人他有多少孩子。


Sample Input 1 

4
1 2
1 3
2 4
Sample Output 1

3
1
0
0

大家都知道家谱的样子吧,如下图,是以树状进行下去的:
在这里插入图片描述
这也要用到一种图的遍历,具体在图和树基础里会讲到,这里我也就不再将了,这种遍历,是用动态数组实现的,输入一个就push一个到动态数组里面,再过一遍就行了。
源代码:

#include <bits/stdc++.h>
using namespace std;
vector<int> a[100010];//动态数组的定义
int father[100010];
int sons[100010];
void dfs(int u){
	for (int i=0;i<a[u].size();i++){
		int v=a[u][i];
		dfs(v);
		sons[u]+=sons[v]+1;//算儿子的数量,放到sons数组里面
	}
}
int main(){
	int n;
	cin >> n;
	
	for (int i=1;i<n;i++){
		int x,y;
		cin >> x>>y;
		father[y] = x;
		a[x].push_back(y);
	}
	int u;
	for (int i=1;i<n;i++){
		if (father[i]==0){
			u=i;//没有父节点的就是祖先根节点
		}
	}
	dfs(u);
	for (int i=1;i<=n;i++){
		cout << sons[i]<<endl;//输出
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值