BZOJ 1131: [POI2008]Sta

来源:互联网 发布:苹果看txt软件 编辑:程序博客网 时间:2024/06/05 08:47

树形dp,水

(要是难的话我就做不来了,折腾了好久还是换了一种转移方式)


#include<cstdio>#include<algorithm>#include<vector>#define N 1001005#define LL long longusing namespace std; int read(){    int a=0,f=1;char c=getchar();    while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}    while(c>='0'&&c<='9'){a=a*10+c-'0';c=getchar();}    return a*f;} struct edge{int to,next;}e[N*2];int n,id,cnt=0,sz[N],head[N];LL totd[N],ans; void work(int x,int fa){    totd[x]=sz[x]=1;    for(int i=head[x];i;i=e[i].next)    {    int y=e[i].to;    if(y==fa) continue;work(y,x);sz[x]+=sz[y];totd[x]+=totd[y]+sz[y];    }}void solve(int x,int fa){    for(int i=head[x];i;i=e[i].next)    {        int y=e[i].to;        if(y==fa) continue;        totd[y]=totd[x]+n-2*sz[y];    solve(y,x);    }}void add(int x,int y){e[++cnt].next=head[x],e[cnt].to=y;head[x]=cnt;}int main(){    n=read();     for(int i=1,x,y;i<n;++i)    {    x=read(),y=read();        add(x,y);add(y,x);     }    work(1,0);    solve(1,0);    ans=totd[1];id=1;    for(int i=1;i<=n;++i)if(totd[i]>ans) ans=totd[i],id=i;    printf("%d\n",id);return 0;}