1. 程式人生 > >[LOJ6175] 「美團 CodeM 初賽 Round B」黑白樹[樹形DP]

[LOJ6175] 「美團 CodeM 初賽 Round B」黑白樹[樹形DP]

return max 染色 pre size turn urn lin 葉子

每次從當前的葉子往上DP(每條鏈上沒有染色的深度最大點視為葉子),先看子樹裏的點能不能染到這個點,染不到就++ans,把這個點的k傳上去,能染到的話要chmax(k[fa[u]], k[u]-1)

vint G[MAXN];
int k[MAXN], fa[MAXN], ans;
inline int dfs(int u) {
  int cur = 0;
  for (int i = 0; i < G[u].size(); i++) 
    chmax(cur, dfs(G[u][i]));
  if (cur <= 1) return ++ans, k[u];
  chmax(k[fa[u]], k[u] - 1);
  return cur - 1;
}
int main() {
  int n; 
  scanf("%d", &n);
  lop(i, 2, n) scanf("%d", fa + i), G[fa[i]].pb(i);
  lop1(i, n) in, k[i];
  ans = 0;
  dfs(1);
  out, ans;
  return 0;
}

[LOJ6175] 「美團 CodeM 初賽 Round B」黑白樹[樹形DP]