题意:给一颗白色的树,然后进行染色,问最少要多少次可以,把整颗树染成黑色,染色标准是:每个节点都有一个 值,
节点到根的链上(包括节点
与根)所有与节点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);
}

京公网安备 11010502036488号