LOADING

加载过慢请开启缓存,浏览器默认开启

daily 1

2023/4/26 daily

CF 274B

还是树形DP
我们可以dfs统计出每个点要的最大add和del的次数,最后的答案就是add[1]+del[1]

void solve(){
  int n;
  cin>>n;
  vector<int>add(n+1),del(n+1),a(n+1);
  vector<vector<int>>E(n+1);
  for(int i=0;i<n-1;++i){
    int u,v;
    cin>>u>>v;
    E[u].push_back(v);
    E[v].push_back(u);
  }
  for(int i=1;i<=n;++i)cin>>a[i];
  function<void(int,int)>dfs=[&](int x,int f){
    for(int v:E[x]){
        if(v==f)continue;
        dfs(v,x);
        add[x]=max(add[x],add[v]);
        del[x]=max(del[x],del[v]);
    }
    a[x]+=add[x];
    a[x]-=del[x];
    if(a[x]>0){
        del[x]+=a[x];
    }else{
        add[x]-=a[x];
    }
  };
  dfs(1,-1);
  cout<<add[1]+del[1]<<'\n';
  return;
}