rt
我的做法和题解一样,代码也差不多,但不知道为什么玄学WA0分,求助各位大佬QwQ
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1010,maxm=2020,INF=2e9;
struct Edge{
int u,v;
}edge[maxm];
int first[maxn],next[maxm],tot,vis[maxn],get[maxn];
int n,f[maxn][6]; //-2,-1,0,1,2
void addedge(int u,int v){
tot++;
edge[tot].u=u;edge[tot].v=v;
next[tot]=first[u];
first[u]=tot;
}
void dfs(int u){
vis[u]=1;
int flag=0;
for(int j=first[u];j;j=next[j]){
int v=edge[j].v;
if(vis[v])continue;
flag=1;
dfs(v);
}
get[u]=1;
if(!flag){
//叶子
f[u][1]=f[u][2]=f[u][3]=1;
f[u][4]=f[u][5]=INF;
return;
}
f[u][1]=1;
f[u][2]=f[u][3]=1e9;
f[u][4]=f[u][5]=0;
int sum3=0,sum4=0;
for(int j=first[u];j;j=next[j]){
int v=edge[j].v;
if(!get[v])continue;
sum3+=f[v][3];
sum4+=f[v][4];
}
for(int j=first[u];j;j=next[j]){
int v=edge[j].v;
if(!get[v])continue;
f[u][1]+=f[v][5];
f[u][2]=min(f[u][2],f[v][1]+sum4-f[v][4]);
f[u][3]=min(f[u][3],f[v][2]+sum3-f[v][3]);
f[u][4]+=f[v][3];
f[u][5]+=f[v][4];
}
for(int i=2;i<=5;i++){
f[u][i]=min(f[u][i],f[u][i-1]);
}
}
int main(){
cin>>n;
for(int i=2;i<=n;i++){
int a;
cin>>a;
//i-a
addedge(i,a);
addedge(a,i);
}
dfs(1);
cout<<f[1][3];
return 0;
}