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