蓝桥杯2021年第十二届省赛真题-左孩子右兄弟 - C语言网 (dotcpp.com)https://www.dotcpp.com/oj/problem2606.html总的来说就是 每个节点的数=儿子的数+这一层节点的个数;
(没有儿子的就等于这一层节点的个数)
样例举例:邻接表如下
1 | 2 | 3 | 4 |
2 | 5 | ||
3 | |||
4 | |||
5 |
从1开始--- 返回1+ 3(1的儿子个数)
从2开始-- 返回0+1(2的儿子个数)
从5开始--返回0
从3开始-- 返回0
从4开始-- 返回0
故一个节点返回的是 儿子返回的数中的最大数+儿子的个数;
最后得出根节点的数;
#include<bits/stdc++.h>
using namespace std;
vector<int>G[100003];
int dfs(int u,int fa)
{
if(u==fa)return 1;
int dis=0;
for(int i=0;i<G[u].size();i++) {//每个儿子
dis=max(dis,dfs(G[u][i],u));
}
return dis+G[u].size();
}
int main()
{
ios::sync_with_stdio(0);cin.tie(0);
int n;cin>>n;
for(int i=2;i<=n;i++){
int x;cin>>x;
G[x].push_back(i);
}
cout<<dfs(1,0);
return 0;
}