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);
    }

    保持热爱 不懈努力 不试试看怎么知道会失败呢(划掉) 世上无难事 只要肯放弃(划掉)
  • 相关阅读:
    foj 2111 Problem 2111 Min Number
    hdoj 1175 连连看
    poj 2377 Bad Cowtractors
    poj 3666 Making the Grade
    2018华南理工大学程序设计竞赛 H-对称与反对称
    hdoj 4293 Groups
    FOJ Problem 2273 Triangles
    poj 3411 Paid Roads
    Codeforces 235A. LCM Challenge
    离散对数二连 poj 2417 Discrete Logging & HDU 2815 Mod Tree
  • 原文地址:https://www.cnblogs.com/ldudxy/p/10174347.html
Copyright © 2011-2022 走看看