POJ1655 Balancing Act (树的重心)
作者:互联网
求树的重心的模板题,size[u]维护以u为根的子树大小,f[u]表示去掉u后的最大子树。
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 using namespace std; 5 const int INF=0x7f7f7f7f; 6 const int N=20005; 7 int head[N],to[N*2],nxt[N*2],f[N],size[N]; 8 int tot,n,T,center,num; 9 10 void add(int x,int y){ 11 nxt[++tot]=head[x]; 12 head[x]=tot; 13 to[tot]=y; 14 } 15 16 void dfs(int u,int fa){ 17 size[u]=1,f[u]=0; 18 for(int i=head[u];i;i=nxt[i]){ 19 int v=to[i]; 20 if(v==fa) continue; 21 dfs(v,u); 22 size[u]+=size[v]; 23 f[u]=max(f[u],size[v]); 24 } 25 f[u]=max(f[u],n-size[u]); 26 if(f[u]<f[center]||f[u]==f[center]&&u<center){ 27 center=u; 28 num=f[u]; 29 } 30 } 31 32 void init(){ 33 memset(head,0,sizeof(head)); 34 tot=0; 35 center=num=0; 36 } 37 38 int main(){ 39 scanf("%d",&T); 40 while(T--){ 41 init(); 42 scanf("%d",&n); 43 int x,y; 44 for(int i=1;i<n;i++){ 45 scanf("%d%d",&x,&y); 46 add(x,y);add(y,x); 47 } 48 f[0]=INF; 49 dfs(1,0); 50 printf("%d %d\n",center,num); 51 } 52 return 0; 53 }
标签:nxt,head,int,tot,POJ1655,Balancing,Act,include,size 来源: https://www.cnblogs.com/yhxnoerror/p/16411515.html