码迷,mamicode.com
首页 > 其他好文 > 详细

BZOJ1131: [POI2008]Sta

时间:2018-04-05 11:46:25      阅读:112      评论:0      收藏:0      [点我收藏+]

标签:poi   pac   sts   ext   std   bzoj1131   答案   add   ansi   

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

题解:首先以1为根统计一次答案,然后每次O(1)换根统计答案

代码:

#include<cstdio>
using namespace std;
int n,cnt,ansid,last[1000005];
long long ans,sz[1000005],f[1000005];
struct node{
    int to,next;
}e[2000005];
void add(int a,int b){
    e[++cnt].to=b;
    e[cnt].next=last[a];
    last[a]=cnt;
}
void dfs1(int x,int fa){
    sz[x]=1;
    f[x]=1;
    for (int i=last[x]; i; i=e[i].next){
        int V=e[i].to;
        if (V==fa) continue;
        dfs1(V,x);
        sz[x]+=sz[V];
        f[x]+=f[V]+sz[V];
    }
}
void dfs2(int x,int fa,long long lastsum){
    long long sum=f[x]+lastsum+n-sz[x];
    if (sum>ans || sum==ans && x<ansid){
        ans=sum;
        ansid=x;
    }
    long long ssum=0;
    for (int i=last[x]; i; i=e[i].next){
        int V=e[i].to;
        if (V==fa) continue;
        ssum+=f[V]+sz[V];
    }
    ssum+=lastsum+n-sz[x];
    for (int i=last[x]; i; i=e[i].next){
        int V=e[i].to;
        if (V==fa) continue;
        dfs2(V,x,ssum-(f[V]+sz[V])+1);
    }
}
int main(){
    scanf("%d",&n);
    for (int i=1; i<n; i++){
        int x,y;
        scanf("%d%d",&x,&y);
        add(x,y);
        add(y,x);
    }
    dfs1(1,0);
    ans=f[1],ansid=1;
    dfs2(1,0,0);
    printf("%d\n",ansid);
    return 0;
}

 

BZOJ1131: [POI2008]Sta

标签:poi   pac   sts   ext   std   bzoj1131   答案   add   ansi   

原文地址:https://www.cnblogs.com/silenty/p/8721302.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!