zoukankan      html  css  js  c++  java
  • E. Tree Painting 二次扫描换根法

    E. Tree Painting

    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    const int maxn=2e5+10;
    int head[maxn*2],nxt[maxn*2],ver[maxn*2];
    int tot=0;
    void add(int u,int v)
    {
        ver[++tot]=v;
        nxt[tot]=head[u];
        head[u]=tot;
    }
    ll f[maxn],size[maxn];
    int n;
    void dfs1(int u,int fa)
    {
        size[u]=1;
        for(int i=head[u]; i; i=nxt[i])
        {
            int v=ver[i];
            if(v==fa) continue;
            dfs1(v,u);
            size[u]+=size[v];
        }
        f[1]+=size[u];
    }
    
    void dfs2(int u,int fa)
    {
        for(int i=head[u]; i; i=nxt[i])
        {
            int v=ver[i];
            if(v==fa) continue;
            f[v]=f[u]+n-2*size[v];
            dfs2(v,u);
        }
    }
    int main()
    {
    
        scanf("%d",&n);
        for(int i=1; i<=n-1; i++)
        {
            int u,v;
            scanf("%d%d",&u,&v);
            add(u,v);
            add(v,u);
        }
        dfs1(1,0);
        dfs2(1,0);
        ll ans=-1e18;
        for(int i=1; i<=n; i++)
        {
            ans=max(ans,f[i]);
    //        printf("%d ",f[i]);
        }
        printf("%lld",ans);
    }
  • 相关阅读:
    this关键字
    方法重载和方法重写
    构造方法
    Java数据类型以及变量的定义
    Java 语言概述
    Java Socket通信
    类图
    JAVA语言编程注意事项
    Scanner--控制台输入
    java运算符
  • 原文地址:https://www.cnblogs.com/dongdong25800/p/11127887.html
Copyright © 2011-2022 走看看