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 }