题目:
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;
}