我们可以用树形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;}
搜索
复制
时间: 2024-10-26 19:03:16