求树的重心
定义一个点的balance为这个点为根时各个子树中最大的那个的大小
balance最小的那个点即为树的重心
不妨把1作为根,那么每个点为根的子树大小可以在一遍dfs过程中求出
如果父节点的那个子树的大小其实就是 n−size(st)
那么这个题就做完了
#include<algorithm>
#include<vector>
#include<cstdio>
using namespace std;
const int maxn = 21234;
vector<int> edge[maxn];
void init(int n){
for(int i=0;i<=n;i++){
edge[i].resize(0);
}
}
int siz[maxn],bal[maxn];
int n;
void dfs(int st,int fa){
siz[st] = 1,bal[st] = 0;
for(vector<int>::iterator it = edge[st].begin();it!=edge[st].end();it++){
int x = *it;
if(x != fa){
dfs(x,st);
siz[st] += siz[x];
bal[st] = max(bal[st],siz[x]);
}
}
bal[st] = max(bal[st],n-siz[st]);
}
int main(){
int T;
scanf("%d",&T);
while(T-- && ~scanf("%d",&n)){
int u,v;
init(n);
for(int i=1;i<n;i++){
scanf("%d %d",&u,&v);
edge[u].push_back(v);
edge[v].push_back(u);
}
dfs(1,0);
int st = min_element(bal+1,bal+n+1)-bal;
printf("%d %d\n",st,bal[st]);
}
return 0;
}