zoukankan      html  css  js  c++  java
  • Codeforces Round #527 (Div. 3)F(DFS,DP)

    #include<bits/stdc++.h>
    using namespace std;
    const int N=200005;
    int n,A[N];
    long long Mx,tot,S[N];
    vector<int>Adj[N];
    void DFS(int v,int p){
        S[v]=A[v];
        for(int &u:Adj[v])
            if(u!=p)
                DFS(u,v),S[v]+=S[u];
        if(p)//0号结点是不存在的
            tot+=S[v];
    }
    void DFS2(int v,int p){
        Mx=max(Mx,tot);
        for(int &u:Adj[v])
            if(u != p){
                tot-=S[u];//换根后新根子树的权重会减小一段,即减为一半
                tot+=S[1]-S[u];//换根后新根子树的父结点与新根结点子树权重的差值会增大一段,即增加一倍
                DFS2(u,v);//对新根继续深度优先搜索
                tot-=S[1]-S[u];//还原为原值
                tot+=S[u];//同上
            }
    }
    int main(){
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%d",&A[i]);
        for(int i=1,v,u;i<n;i++)
            scanf("%d%d",&v,&u),Adj[v].push_back(u),Adj[u].push_back(v);
        DFS(1,0);//深度优先搜索每个结点子树(包含当前结点)的权重
        DFS2(1,0);//深度优先搜索换根后的WPL值
        return !printf("%lld",Mx);
    }

    保持热爱 不懈努力 不试试看怎么知道会失败呢(划掉) 世上无难事 只要肯放弃(划掉)
  • 相关阅读:
    git 账号密码
    sql server 备份
    计算经纬度的两点之间的距离
    redis 安装
    webapi 可空参数
    Asp.Net MVC4 使用Unity 实现依赖注入
    sublime主题推荐
    分解质数因子
    如何在sublime+chrome中调试php代码?
    php的mysql语句里变量加不加单引号问题
  • 原文地址:https://www.cnblogs.com/ldudxy/p/10174347.html
Copyright © 2011-2022 走看看