根据题目描述,我们可以知道,当某个结点要获取最长长度时候,其某个能获取最长长度的子节点和其兄弟数量的和就是当前的最长长度,因此我们可以用树形dp来依次获取最长的长度,因为我们只需要知道某个节点的子节点数量即可,所以我们可以直接用vector的二维数组来表示两个节点的关系,同时也能获取子节点的数量,再使用dfs依次向下探索,寻找能够获取最长长度的子节点即可
上代码
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
using namespace std;
const int N = 1e5 + 10;
vector <int> g[N];//开一个二维动态数组g,g[i][j]表示j的父节点是i
int n;
int dfs(int x)
{
int mx = 0;//mx表示最长长度
for(int i = 0; i < g[x].size(); i++){
mx = max(mx, dfs(g[x][i]));//依次向下遍历,获取当前节点能获得的最长长度,就是本身加上兄弟的数量
}
return g[x].size() + mx;
}
int main(void)
{
cin >> n;
for(int i = 2; i <= n; i++){
int x; cin >> x;
g[x].push_back(i);//因为x是i的父节点因此要在g[x]后面增加i
}
cout << dfs(1) << endl;//从1开始遍历,寻找当前最长的树,最后加上当前的兄弟数量就是可以获得的最大高度
return 0;
}