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

COJ 2003 选根 (树的重心)

时间:2015-05-27 00:38:41      阅读:198      评论:0      收藏:0      [点我收藏+]

标签:

我们可以用树形DP在线性复杂度内搞定重心。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<algorithm>
 5 #include<queue>
 6 #include<cstring>
 7 #define PAU putchar(‘ ‘)
 8 #define ENT putchar(‘\n‘)
 9 using namespace std;
10 const int maxn=100000+10;
11 struct tedge{int x,y,next;}adj[maxn<<1];int ms=0,fch[maxn];
12 void addedge(int u,int v){
13     adj[++ms]=(tedge){u,v,fch[u]};fch[u]=ms;
14     adj[++ms]=(tedge){v,u,fch[v]};fch[v]=ms;
15     return;
16 }
17 int s[maxn],f[maxn],cg,n;
18 void findcg(int u,int fa){
19     s[u]=1;int mxs=0;
20     for(int i=fch[u];i;i=adj[i].next){
21         int v=adj[i].y;if(v!=fa){
22             findcg(v,u);
23             s[u]+=s[v];
24             mxs=max(mxs,s[v]);
25         }
26     } f[u]=max(n-s[u],mxs);
27     if(f[u]<f[cg]) cg=u;
28     else if(f[u]==f[cg]) cg=min(u,cg);return;//编号小的 
29 }
30 inline int read(){
31     int x=0,sig=1;char ch=getchar();
32     while(!isdigit(ch)){if(ch==-)sig=-1;ch=getchar();}
33     while(isdigit(ch))x=10*x+ch-0,ch=getchar();
34     return x*=sig;
35 }
36 inline void write(int x){
37     if(x==0){putchar(0);return;}if(x<0)putchar(-),x=-x;
38     int len=0,buf[15];while(x)buf[len++]=x%10,x/=10;
39     for(int i=len-1;i>=0;i--)putchar(buf[i]+0);return;
40 }
41 void init(){
42     n=read();f[cg=0]=n;
43     for(int i=1;i<n;i++) addedge(read(),read());
44     findcg(1,0);
45     write(cg);
46     return;
47 }
48 void work(){
49     return;
50 }
51 void print(){
52     return;
53 }
54 int main(){init();work();print();return 0;}

 

COJ 2003 选根 (树的重心)

标签:

原文地址:http://www.cnblogs.com/chxer/p/4532036.html

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