好吧,提到这一道题感觉时间好久远啊,第一次是在洛谷上面看到的,因为洛谷上面写的是动态规划结果往动归上觉得状态太多一直没有想出来,看到一个贪心的博客很不错:http://www.cnblogs.com/JSZX11556/p/5102075.html
空说无凭看代码注释把
#include<cstdio>
#include<cstring>
#include<iostream>
#include<vector>
#define maxn 1010
#define PB push_back
using namespace std;
int n,f[maxn],ans;
vector<int >g[maxn];
void dfs(int u,int fa){
int Max=-1e9,Min=1e9;
for(int i=0;i<g[u].size();i++){
int v=g[u][i];if(v==fa)continue;
dfs(v,u);
Min=min(Min,f[v]),Max=max(Max,f[v]);//距离自己最近的消防局和最远的消防局
}
if(Min+Max<=3)f[u]=Min+1;//子树的消防局可以互相覆盖就直接加上最近的
else f[u]=Max+1;//不能互相覆盖
if(Max==-1e9)f[u]=3;
if(f[u]==5){
ans++;f[u]=0;//到达要求的最优情况
}
if(f[u]>=3&&fa==-1)ans++;///根节点
}
int main(){
scanf("%d",&n);
for(int x,i=2;i<=n;i++){
scanf("%d",&x);
g[x].PB(i),g[i].PB(x);
}
dfs(1,-1);
printf("%d",ans);
return 0;
}