zoukankan      html  css  js  c++  java
  • bzoj1131 Sta

    给出一个N个点的树,找出一个点来,以这个点为根的树时,所有点的深度之和最大

    n<=1000000

    发现当根从某个位置移到它的一个子树时只要O1的时间就可以果断得出ans

    所以大概就一个dfs完事

    #include<iostream>
    #include<cstdlib>
    #include<algorithm>
    #include<cstdio>
    #include<cmath>
    #include<cstring>
    #define ll long long
    const int MAXN=1000010;
    using namespace std;
    int n,a,b;
    int first[2*MAXN],to[2*MAXN],next[2*MAXN],cnt;
    inline void add(int u,int v)
    {
        to[++cnt]=v;
        next[cnt]=first[u];
        first[u]=cnt;
        to[++cnt]=u;
        next[cnt]=first[v];
        first[v]=cnt;
    }
    int rank[MAXN],size[MAXN];
    ll dp[MAXN];
    void rank_dfs(int x,int fa)
    {
        size[x]=1;
        dp[x]=rank[x];
        for(int i=first[x];i;i=next[i])
        {
            if(to[i]==fa)continue;
            rank[x]=rank[to[i]]+1;
            rank_dfs(to[i],x);
            size[x]+=size[to[i]];
        }
    }
    void dfs(int x,int fa)
    {
        for(int i=first[x];i;i=next[i])
        {
            if(to[i]==fa)continue;
            dp[to[i]]=dp[x]+n-2*size[to[i]];
            dfs(to[i],x);
        }
    }
    int main()
    {
        scanf("%d",&n);
        for(int i=1;i<n;i++){scanf("%d%d",&a,&b);add(a,b);}
        rank_dfs(1,0);
        dfs(1,0);
        int ans=1;
        for(int i=1;i<=n;i++)
            if(dp[i]>dp[ans])ans=i;
        cout<<ans;
        return 0;
    } 
    View Code
  • 相关阅读:
    java实现复制网站内容
    java实现复制网站内容
    java实现递归连续数
    java实现递归连续数
    java实现递归连续数
    java实现递归连续数
    java实现递归连续数
    java实现串中找数字
    java实现串中找数字
    java实现串中找数字
  • 原文地址:https://www.cnblogs.com/Kong-Ruo/p/7718429.html
Copyright © 2011-2022 走看看