$f_{i,0}$表示$i$本身被覆盖,

$f_{i,1}$表示$i$至少有一个儿子被覆盖,

$f_{i,2}$表示$i$至少有一个孙子被覆盖,

$f_{i,3}$表示$i$所有儿子合法,

$f_{i,4}$表示$i$所有孙子合法。

转移方程为:($j,k$均为$i$的儿子)

$\begin{cases}f_{i,0}=1+\sum\limits_{j}\min\{f_{j,0~ to ~4}\}\\f_{i,1}=\min\{f_{k,0}+\sum\limits_{j\ne k}\min\{f_{j,0 ~to~3}\}\}\\f_{i,2}=\min\{f_{k,1}+\sum\limits_{j\ne k}\min\{f_{j,0 ~to~2}\}\}\\f_{i,3}=\sum f_{j,2}\\f_{i,4}=\sum f_{j,3}\end{cases}$

令$f_{i,k}(k\ge 2)=\min\{f_{i,0~to~k}\}$进行优化

$\begin{cases}f_{i,0}=1+\sum\limits_{j}f_{j,4}\\f_{i,1}=f_{i,4}+\min\{f_{k,0}-f_{k,3}\}\\f_{i,2}=f_{i,3}+\min\{f_{k,1}-f_{k,2}\}\\f_{i,3}=\sum f_{j,2}\\f_{i,4}=\sum f_{j,3}\end{cases}$

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#define ll long long
#define gc getchar()
using namespace std;
const int N=1e3+5;
inline void qr(int &x)
{
    x=0;char c=gc;
    while(c<'0'||c>'9')c=gc;
    while(c>='0'&&c<='9'){x=x*10+(c^48);c=gc;}
}
void qw(int x)
{
    if(x/10)qw(x/10);
    putchar(x%10+48);
}
struct edge{int y,next;}a[N<<1];int len,last[N];
void ins(int x,int y){a[++len]=(edge){y,last[x]};last[x]=len;}
int f[N][5];
void dfs(int x)
{
    int s4=0,s3=0,s2=0,x1=9999999,x2=9999999;
    for(int k=last[x];k;k=a[k].next)
    {
        int y=a[k].y;
        dfs(y);
        x1=min(x1,f[y][0]-f[y][3]);x2=min(x2,f[y][1]-f[y][2]);
        s4+=f[y][4];s3+=f[y][3];s2+=f[y][2];
    }
    f[x][0]=s4+1;f[x][1]=s3+x1;
    f[x][2]=s2+x2;f[x][3]=s2;
    f[x][4]=s3;
    f[x][2]=min(f[x][2],min(f[x][1],f[x][0]));
    f[x][3]=min(f[x][2],f[x][3]);
    f[x][4]=min(f[x][3],f[x][4]);
}
int main()
{
    int n;qr(n);
    for(int i=2,x;i<=n;i++)
    {
        qr(x);ins(x,i);
    }
    dfs(1);
    qw(f[1][2]);puts("");
    return 0;
}