POJ1655 Balancing Act(树的重心)
树的重心即树上某结点,删除该结点后形成的森林中包含结点最多的树的结点数最少。
一个DFS就OK了。。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 #define MAXN 222222 6 struct Edge{ 7 int u,v,next; 8 }edge[MAXN<<1]; 9 int NE,head[MAXN]; 10 void addEdge(int u,int v){ 11 edge[NE].u=u; edge[NE].v=v; edge[NE].next=head[u]; 12 head[u]=NE++; 13 } 14 int n,size[MAXN],x,y; 15 void dfs(int u,int fa){ 16 int cnt=1,res=0; 17 for(int i=head[u]; i!=-1; i=edge[i].next){ 18 int v=edge[i].v; 19 if(v==fa) continue; 20 dfs(v,u); 21 cnt+=size[v]; 22 res=max(res,size[v]); 23 } 24 size[u]=cnt; 25 res=max(res,n-size[u]); 26 if(y>res) y=res,x=u; 27 else if(y==res && x>u) x=u; 28 } 29 int main(){ 30 int t,a,b; 31 scanf("%d",&t); 32 while(t--){ 33 NE=0; 34 memset(head,-1,sizeof(head)); 35 scanf("%d",&n); 36 for(int i=1; i<n; ++i){ 37 scanf("%d%d",&a,&b); 38 addEdge(a,b); addEdge(b,a); 39 } 40 y=(1<<30); 41 dfs(1,0); 42 printf("%d %d\n",x,y); 43 } 44 return 0; 45 }