【每日一题】 黑白树 dfs

黑白树

https://ac.nowcoder.com/acm/problem/13249

思路:
我们可以发现叶子节点是一定要染的,如果从下往上染没染过的点,不一定是最优的,所以对于其他的结点,我们更新最大染色范围,如果该结点的子节点可以染色到它的话,那么他就不需要再染色,否则它就需要被染色,同时选择子节点内范围最大的点染色,更新最大范围。

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
vector<int> v[N];
int n, res, k[N];
int dfs(int x, int fa) {
  int sum = 0;
  for (auto now : v[x]) sum = max(sum, dfs(now, x));
  if (!sum) {
    res++;
    return k[x] - 1;
  }
  k[fa] = max(k[fa], k[x] - 1);
  return sum - 1;
}
int main() {
  cin >> n;
  for (int i = 2; i <= n; i++) {
    int x;
    cin >> x;
    v[x].push_back(i);
  }
  for (int i = 1; i <= n; i++) cin >> k[i];
  dfs(1, 0);
  cout << res << endl;
  return 0;
}
全部评论

相关推荐

给🐭🐭个面试机会...:我擦seed✌🏻
点赞 评论 收藏
分享
12-14 11:43
黑龙江大学 Java
用微笑面对困难:确实比较烂,可以这么修改:加上大学的qs排名,然后大学简介要写一些,然后硕士大学加大加粗,科研经历第一句话都写上在复旦大学时,主要负责xxxx,简历左上角把学校logo写上,建议用复旦大学的简历模板
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务