树的重心
题目大意:
给定一颗树,树中包含n个结点(编号1~n)和n-1条无向边。
请你找到树的重心,并输出将重心删除后,剩余各个连通块中点数的最大值。
重心定义:重心是指树中的一个结点,如果将这个点删除后,剩余各个连通块中点数的最大值最小,那么这个节点被称为树的重心。
Code:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn=1e5+7;
int n,ans=0x3f3f3f3f;
vector<int> ve[maxn];
int dfs(int u,int fa){
int res=0,sum=1;
for(auto v:ve[u]){
if(v==fa) continue;
int s=dfs(v,u); //s是子树分支(也就是v为根节点)的节点个数
sum+=s; //以u为根节点的子树(所有的v+u这个根节点)的所有节点
res=max(res,s); //哪个子树有最多的节点
}
res=max(res,n-sum); //子树的另一端的节点个数
ans=min(ans,res);
return sum;
}
int main(){
cin>>n;
for(int i=1;i<n;i++){
int a,b;
cin>>a>>b;
ve[a].push_back(b);
ve[b].push_back(a);
}
dfs(1,0);
cout<<ans<<endl;
return 0;
}