zoukankan      html  css  js  c++  java
  • Codeforces Round #627 (Div. 3) F

    题意:

    n 个点 n - 1 条边的树,问每个点所在所有子树中白黑点数目的最大差。

    思路:

    白点先由下至上汇集,后由上至下分并。

    #include <bits/stdc++.h>
    using namespace std;
    
    const int M=220000;
    
    vector<vector<int>> e(M);
    
    int n,a[M];
    
    void dfs1(int u,int pre){
        for(int v:e[u]){
            if(v!=pre){
                dfs1(v,u);
                a[u]+=max(0,a[v]);
            }
        }
    }
    
    void dfs2(int u,int pre){
        for(int v:e[u]){
            if(v!=pre){
                a[v]+=max(0,a[u]-max(0,a[v]));
                dfs2(v,u);
            }
        }
    }
    
    int main(){
        cin>>n;
        for(int i=0;i<n;i++){
            cin>>a[i];
            if(a[i]==0) a[i]=-1;
        }
        for(int i=0;i<n-1;i++){
            int u,v;cin>>u>>v;
            --u,--v;
            e[u].push_back(v);
            e[v].push_back(u);
        }
        dfs1(0,-1);
        dfs2(0,-1);
        for(int i=0;i<n;i++) cout<<a[i]<<' ';
        return 0;
    }
  • 相关阅读:
    解释之前遗留的方法覆盖问题
    多态在开发中的作用
    多态的基础语法
    Go 统计汉子字符
    Go map
    Go make和new的区别
    Go 指针
    Go 切片
    Go数组
    Go中交换两个值类型
  • 原文地址:https://www.cnblogs.com/Kanoon/p/12486896.html
Copyright © 2011-2022 走看看