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 }

 

posted @ 2016-02-23 21:21  WABoss  阅读(182)  评论(0编辑  收藏  举报