1131: [POI2008]Sta
Description
给出一个N个点的树,找出一个点来,以这个点为根的树时,所有点的深度之和最大
Input
给出一个数字N,代表有N个点.N<=1000000 下面N-1条边.
Output
输出你所找到的点,如果具有多个解,请输出编号最小的那个.
Sample Input
8
1 4
5 6
4 5
6 7
6 8
2 4
3 4
1 4
5 6
4 5
6 7
6 8
2 4
3 4
Sample Output
7
树形DP。。
1 #include<iostream> 2 #include<cstdlib> 3 #include<cmath> 4 #include<cstring> 5 #include<cstdio> 6 #include<algorithm> 7 #include<string> 8 #include<map> 9 #include<queue> 10 #include<vector> 11 #include<set> 12 #define inf 1000000000 13 #define maxn 1000000+5 14 #define maxm 2000000+5 15 #define eps 1e-10 16 #define ll long long 17 #define for0(i,n) for(int i=0;i<=(n);i++) 18 #define for1(i,n) for(int i=1;i<=(n);i++) 19 #define for2(i,x,y) for(int i=(x);i<=(y);i++) 20 #define for3(i,x,y) for(int i=(x);i>=(y);i--) 21 #define for4(i,x) for(int i=head[x],y=e[i].go;i;i=e[i].next,y=e[i].go) 22 using namespace std; 23 int read(){ 24 int x=0,f=1;char ch=getchar(); 25 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} 26 while(ch>='0'&&ch<='9'){x=10*x+ch-'0';ch=getchar();} 27 return x*f; 28 } 29 struct edge{ 30 int go,next; 31 }e[maxm]; 32 int n,tot,ans,head[maxn],size[maxn],fa[maxn]; 33 ll sum,f[maxn],g[maxn]; 34 void insert(int u,int v){ 35 e[++tot]=(edge){v,head[u]};head[u]=tot; 36 e[++tot]=(edge){u,head[v]};head[v]=tot; 37 } 38 void dfs1(int x){ 39 f[x]=size[x]=1; 40 for4(i,x) 41 if(y!=fa[x]){ 42 fa[y]=x; 43 dfs1(y); 44 size[x]+=size[y]; 45 f[x]+=f[y]+size[y]; 46 } 47 } 48 void dfs2(int x){ 49 for4(i,x) 50 if(y!=fa[x]){ 51 g[y]=f[x]+g[x]-f[y]-size[y]+n-size[y]; 52 dfs2(y); 53 } 54 } 55 int main(){ 56 //freopen("input.txt","r",stdin); 57 //freopen("output.txt","w",stdout); 58 n=read(); 59 for1(i,n-1){ 60 int u=read(),v=read(); 61 insert(u,v); 62 } 63 dfs1(1); 64 dfs2(1); 65 for1(i,n){ 66 g[i]+=f[i]; 67 if(g[i]>sum){ 68 sum=g[i];ans=i; 69 } 70 } 71 printf("%d",ans); 72 return 0; 73 }