树的重心

变量

  • int sum\texttt{int sum}:求重心的树的节点总数。
  • int sze[i]\texttt{int sze[i]}:节点 ii 的子树的大小。
  • int weight[i]\texttt{int weight[i]}:以节点 ii 为树根时其最大子树的大小。
  • int center[i]\texttt{int center[i]}:存放最多两个重心。
  • int center_cnt\texttt{int center\_cnt}:重心个数。

函数

  • void init()\texttt{void init()}:初始化。
  • void dfs(int x,int fa)\texttt{void dfs(int x,int fa)}:深搜求重心。
  • void ask(int root,int n)\texttt{void ask(int root,int n)}:计算节点总数为 nn,树的一个节点为 rootroot 时的重心。

代码

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;
posted @ 2022-09-03 23:56  luckydrawbox  阅读(7)  评论(0)    收藏  举报  来源