家谱

题目:
在这里插入图片描述
在这里插入图片描述
代码如下:

#include<bits/stdc++.h>
using namespace std;
#define MAX 100005
int n,f[MAX],u[MAX],v;
vector<int> a[MAX];
int dfs(int x)
{
	int res = 0;
	for(int i = 0;i < a[x].size();i++) res += dfs(a[x][i]);
	f[x] = res;
	return f[x] + 1;//他的子孙
}
int main()
{
	int x,y;
	cin >> n;
	for(int i = 0;i < n - 1;i++){
		cin >> x >> y;
		a[x].push_back(y);
		u[y] = 1;
	}
	for(int i = 1;i <= n;i++){
		if(u[i] == 0){
			v = i;	//找到祖宗 
			break;
		}
	} 
	dfs(v); 
	for(int i = 1;i <= n;i++) cout << f[i] << endl;
	return 0;
}

这题可以用dfs去完成,输入的时候采用vector来保存(也就是邻接表的保存方法)。在从多人当中没当过儿子的才是父结点,找到父结点开始进行bfs。每个人的子孙数量用数组f[]保存,递归过程中每次return需要另加其自己,最后打印f[i].

猜你喜欢

转载自blog.csdn.net/qq_41998938/article/details/87631251