题意:就是裸的求树的重心。
1 #include<cstring> 2 #include<algorithm> 3 #include<cmath> 4 #include<cstdio> 5 #include<iostream> 6 #define N 20007 7 #define inf 100000007 8 using namespace std; 9 10 int n,id,mnum; 11 int siz[N]; 12 int cnt,head[N],next[N*2],rea[N*2]; 13 14 void add(int u,int v) 15 { 16 next[++cnt]=head[u]; 17 head[u]=cnt; 18 rea[cnt]=v; 19 } 20 void dfs(int u,int fa) 21 { 22 int sum=0,msiz=-1; 23 siz[u]=1; 24 for (int i=head[u];i!=-1;i=next[i]) 25 { 26 int v=rea[i]; 27 if (v==fa) continue; 28 dfs(v,u); 29 siz[u]+=siz[v]; 30 msiz=max(msiz,siz[v]); 31 } 32 msiz=max(msiz,n-siz[u]); 33 if ((msiz==mnum&&u<id)||msiz<mnum) 34 { 35 id=u; 36 mnum=msiz; 37 } 38 } 39 int main() 40 { 41 int T;scanf("%d",&T); 42 while(T--) 43 { 44 scanf("%d",&n); 45 cnt=0; 46 memset(head,-1,sizeof(head)); 47 memset(siz,0,sizeof(siz)); 48 for (int i=1,x,y;i<n;i++) 49 { 50 scanf("%d%d",&x,&y); 51 add(x,y),add(y,x); 52 } 53 id=-1,mnum=inf; 54 dfs(1,-1); 55 printf("%d %d ",id,mnum); 56 } 57 }