题目:
代码如下:
#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].