左孩子右兄弟(dfs,贪心)(蓝桥杯)
思路:选择一个儿子作为主干其他儿子作为养料

#include <bits/stdc++.h> using namespace std; #define ri register int #define M 100005 template <class G> void read(G &x) { x=0;int f=0; char ch=getchar(); while(ch<'0'||ch>'9'){f|=ch=='-';ch=getchar();} while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();} x=f?-x:x; return ; } int n; vector <int> p[M]; int dfs(int a) { int mx=0; if(p[a].size()==0) return 1; for(ri i=0;i<p[a].size();i++) { int b=p[a][i]; mx=max(mx,dfs(b)); } mx+=p[a].size()-1; return mx+1; } int main(){ read(n); for(ri i=2;i<=n;i++) { int a; read(a); p[a].push_back(i); } int ans=0; ans=dfs(1)-1; printf("%d",ans); return 0; }