BZOJ 1131 POI2008 Sta 树形DP

来源:互联网 发布:南京软件大学 编辑:程序博客网 时间:2024/06/05 07:07

题目大意:给定一棵树,求一个点,使以这个点为根时深度之和最大,在此基础上要求编号最小

裸TreeDP。。。

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define M 1001001using namespace std;struct abcd{int to,next;}table[M<<1];int head[M],tot;int n,ans,size[M];long long sum[M],max_ans=0;void Add(int x,int y){table[++tot].to=y;table[tot].next=head[x];head[x]=tot;}void DFS(int x,int from){int i;sum[x]=size[x]=1;for(i=head[x];i;i=table[i].next)if(table[i].to!=from){DFS(table[i].to,x);size[x]+=size[table[i].to];sum[x]+=sum[table[i].to]+size[table[i].to];}}void Tree_DP(int x,int from){int i;for(i=head[x];i;i=table[i].next)if(table[i].to!=from){sum[table[i].to]=sum[x]+size[1]-2*size[table[i].to];Tree_DP(table[i].to,x);}}int main(){int i,x,y;cin>>n;for(i=1;i<n;i++){scanf("%d%d",&x,&y);Add(x,y);Add(y,x);}DFS(1,0);Tree_DP(1,0);for(i=1;i<=n;i++)if(sum[i]>max_ans)max_ans=sum[i],ans=i;cout<<ans<<endl;return 0;}


0 0