POJ 1655 Balancing Act (求树的重心)
求树的重心,直接当模板吧。先看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 }