P2279 [HNOI2003] 消防局的设立

/*
->树中的节点都只有一个爹
->最深的未被覆盖的点 的祖父 应该设立消防站
-> ai<i  fa[i]已出现 

选取一个点时 更新父 祖父 节点的信息+兄弟点也会影响 父代 信息-> min()
->cover[i] 离i最近的消防站距离 
 
 
*/
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
//#include<queue>
//#include<vector>
#include<bits/stdc++.h>
#define ll long long
#define ddd printf("-----------------------\n");
using namespace std;
const int maxn=1e4+10 ;
const int inf=0x3f3f3f3f;

int n,fa[maxn],dep[maxn],cov[maxn],biao[maxn],ans;

bool cmp(int a,int b){
    return dep[a]>dep[b];
}

int main()
{
    ios::sync_with_stdio(false);
    cin>>n;    fa[1]=1,dep[1]=1,biao[1]=1;
    memset(cov,inf,sizeof(cov));
    
    for(int i=2;i<=n;i++) cin>>fa[i],dep[i]=dep[fa[i]]+1,biao[i]=i;
    
    sort(biao+1,biao+1+n,cmp);
    
    for(int i=1;i<=n;i++)
    {
        int u=biao[i],f1=fa[u],f2=fa[f1];
        cov[u]=min(cov[u],cov[f1]+1);
        cov[u]=min(cov[u],cov[f2]+2);
        if(cov[u]>2)
        {
            ans++;
            cov[f2]=0;
            cov[fa[f2]]=min(cov[fa[f2]],1);
            cov[fa[fa[f2]]]=min(cov[fa[fa[f2]]],2);
        }
    }
    
    cout<<ans<<endl;
    
    return 0;
}

 

posted @ 2023-09-17 16:07  JMXZ  阅读(11)  评论(0)    收藏  举报