E86 换根DP CF1324F Maximum White Subtree

视频链接:E86 换根DP CF1324F Maximum White Subtree_哔哩哔哩_bilibili

 

 

Maximum White Subtree - 洛谷 | 计算机科学教育新生态

// 换根DP O(n)
#include <bits/stdc++.h>
using namespace std;

const int N=200005;
vector<int> e[N];
int n,a[N],f[N];

void dfs(int u,int fa){
  f[u]=a[u];
  for(auto v:e[u]){
    if(v==fa)continue;
    dfs(v,u);
    if(f[v]>0) f[u]+=f[v];
  }
}
void dfs2(int u,int fa){
  for(auto v:e[u]){
    if(v==fa)continue;
    if(f[v]>0) f[v]=max(f[v],f[u]);
    else  f[v]=max(f[v],f[v]+f[u]);
    dfs2(v,u);
  }
}
int main(){
  ios::sync_with_stdio(false);
  cin.tie(0);cout.tie(0);
  cin>>n;
  for(int i=1;i<=n;++i){
    cin>>a[i];
    if(a[i]==0) a[i]=-1;
  }
  for(int i=1,x,y;i<n;++i){
    cin>>x>>y;
    e[x].push_back(y);
    e[y].push_back(x);
  }
  dfs(1,0);
  dfs2(1,0);
  for(int i=1;i<=n;++i)cout<<f[i]<<' ';
}

 

posted @ 2024-12-03 20:39  董晓  阅读(41)  评论(0编辑  收藏  举报