题意:给一颗白色的树,然后进行染色,问最少要多少次可以,把整颗树染成黑色,染色标准是:每个节点都有一个图片说明 值,图片说明 节点到根的链上(包括节点图片说明 与根)所有与节点i距离小于图片说明 的点都会变黑.
题解:贪心,根据题意可以将树退化成,一条线,如:
图片说明
对于下图,圈内表示图片说明,所以我们答案应为2次,可以选择倒数第二个节点,一直到根节点为需要1次,加上最后的剩余的叶子节点,记1次,一共要2次.
但是可以把树变为下面这种情况.即图片说明 ,倒数第三个节点
图片说明
然后就是图片说明 遍历整个树,以及改变图片说明
时间复杂度图片说明

#include <bits/stdc++.h>
using namespace std;
const int N  = 1e5+100;
int n;
vector<int> v[N];
int k[N],fa[N];
int ans=0;
int dfs(int x){
    int now = 0, siz = v[x].size();
    for(int i=0;i<siz;i++)
        now=max(now,dfs(v[x][i]));
    if(now<=0){
        ans++;
        return k[x]-1;
    }
    k[fa[x]]=max(k[fa[x]],k[x]-1);//改变k[i]
    return now-1;
}

int main(){
    int n;
    scanf("%d", &n);
    for(int i=2;i<=n;i++){
        int d;
        scanf("%d", &d);
        v[d].push_back(i);
        fa[i]=d;
    }
    for(int i=1;i<=n;i++)
        scanf("%d", &k[i]);
    dfs(1);
    printf("%d\n",ans);
}