POJ3107 Godfather (树的重心)

又是一道模板题......

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 using namespace std;
 5 const int INF=0x7f7f7f7f;
 6 const int N=50005;
 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 init(){
17     memset(head,0,sizeof(head));
18     tot=0;
19     center=num=0;
20 }
21 
22 void dfs(int u,int fa){
23     size[u]=1,f[u]=0;
24     for(int i=head[u];i;i=nxt[i]){
25         int v=to[i];
26         if(v==fa) continue;
27         dfs(v,u);
28         size[u]+=size[v];
29         f[u]=max(f[u],size[v]);
30     }
31     f[u]=max(f[u],n-size[u]);
32     if(f[u]<f[center]){
33         center=u;
34         num=f[u];
35     }
36 }
37 
38 int main(){
39     init();
40     scanf("%d",&n);
41     int x,y;
42     for(int i=1;i<n;i++){
43         scanf("%d%d",&x,&y);
44         add(x,y);add(y,x);
45     }
46     f[0]=INF;
47     dfs(1,0);
48     for(int i=1;i<=n;i++)
49         if(f[i]==num) printf("%d ",i);
50     return 0;
51 }

 

posted @ 2022-06-25 14:34  YHXo  阅读(19)  评论(0编辑  收藏  举报