变量
- int sum:求重心的树的节点总数。
- int sze[i]:节点 i 的子树的大小。
- int weight[i]:以节点 i 为树根时其最大子树的大小。
- int center[i]:存放最多两个重心。
- int center_cnt:重心个数。
函数
- void init():初始化。
- void dfs(int x,int fa):深搜求重心。
- void ask(int root,int n):计算节点总数为 n,树的一个节点为 root 时的重心。
代码
struct Tree_Center{
int sum;
int sze[N],weight[N];
int center[3],center_cnt;
void init(){
center_cnt=0;
memset(sze,0,sizeof(sze));
memset(weight,0,sizeof(weight));
memset(center,0,sizeof(center));
}
void dfs(int x,int fa){
sze[x]=1;
weight[x]=0;
for(int i=head[x];i;i=nxt[i]){
int y=ver[i];
if(y==fa)
continue;
dfs(y,x);
sze[x]+=sze[y];
weight[x]=max(weight[x],sze[y]);
}
weight[x]=max(weight[x],sum-sze[x]);
if(weight[x]<=sum/2)
center[++center_cnt]=x;
}
void ask(int root,int n){
sum=n;
init();
dfs(root,0);
}
}tree;