码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 1655 Balancing Act (求树的重心)

时间:2016-04-15 00:04:18      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:

求树的重心,直接当模板吧。先看POJ题目就知道重心什么意思了。。。

重心:删除该节点后最大连通块的节点数目最小

技术分享
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<queue>
 5 #include<stack>
 6 using namespace std;
 7 #define LL long long
 8 #define clc(a,b) memset(a,b,sizeof(a))
 9 #define inf 0x3f3f3f3f
10 const int maxn=20010;
11 vector<int>v[maxn];
12 int vis[maxn],dp[maxn],son[maxn];
13 int ans,sizee,n;
14 void dfs(int x){
15     int bal=0;
16     son[x]=0;
17     vis[x]=true;
18     for(int i=0;i<(int)v[x].size();i++){
19         int to=v[x][i];
20         if(vis[to]) continue;
21             dfs(to);
22         son[x]+=son[to]+1;
23         bal=max(bal,son[to]+1);
24     }
25     bal=max(bal,n-son[x]-1);
26     if(bal<sizee||(bal==sizee && x<ans)){
27         ans=x,sizee=bal;
28     }
29 }
30 int main(){
31     int T;
32     scanf("%d",&T);
33     while(T--){
34     scanf("%d",&n);
35     for(int i=1;i<=n;i++)
36         v[i].clear();
37     for(int i=1;i<=n-1;i++){
38         int x,y;
39         scanf("%d%d",&x,&y);
40         v[x].push_back(y);
41         v[y].push_back(x);
42     }
43     clc(vis,0);
44     sizee=inf;
45     dfs(1);
46     printf("%d %d\n",ans,sizee);
47     }
48     return 0;
49 }
View Code

 

POJ 1655 Balancing Act (求树的重心)

标签:

原文地址:http://www.cnblogs.com/ITUPC/p/5393415.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!