A91495 正经题解
2025-11-22 16:02:52
发布于:广东
23阅读
0回复
0点赞
解题思路
树形问题,先建个图。
经过人脑模拟,我们可以发现,要想最大化深度,就得把贡献最大的右兄弟放在兄弟链最后,如本题样例:
1 1
├── 2 └── 3 —— 4 —— 2
│ └── 5 ——> └── 5
├── 3
└── 4
所以,对于每个节点 ,以 为根的子树的最大深度就是子节点个数加上所有以其子节点为根的子树的最大深度,即右兄弟排在一起的长度加上这些兄弟里最有实力的一个所拥有的贡献(放在最后的那个右兄弟的贡献)。当一个节点没有子节点时,它的子树深度只能为,边界条件出来了,以这些为基本向上传递子问题的最优解,合并状态,题就解出来了。
注意审题,要求最大值,不是按输入顺序就能算出来的TAT
AC代码
#include <bits/stdc++.h>
using namespace std;
vector<int> child[100005];
int dfs(int u){
vector<int> d;
for(int c:child[u]){
d.push_back(dfs(c));
}
sort(d.rbegin(), d.rend());
int res = child[u].size();
if(!d.empty()){
res += d[0];
}
return res;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int n;
cin >> n;
for(int i=2;i<=n;++i){
int fa;
cin >> fa;
child[fa].push_back(i);
}
int ans = dfs(1);
cout << ans;
return 0;
}
这里空空如也





有帮助,赞一个