刚学点分治,有个求重心的问题!
  • 板块学术版
  • 楼主L_MaJiaQi
  • 当前回复8
  • 已保存回复8
  • 发布时间2023/12/1 16:13
  • 上次更新2023/12/1 19:29:29
查看原帖
刚学点分治,有个求重心的问题!
1004860
L_MaJiaQi楼主2023/12/1 16:13

按照点分治1模板题解中求子树的重心是这样的

il void getroot(int u, int fr)
{
	dp[u] = 0, size[u] = 1;
	Next(i, u)
	{
		int v = e[i].v;
		if(v == fr || vis[v]) continue;
		getroot(v, u);
		size[u] += size[v];
		dp[u] = max(dp[u], size[v]);
	}
	dp[u] = max(dp[u], sum - size[u]);
	if(dp[u] < dp[root]) root = u;
}
il void solve(int u)
{
	vis[u] = pd[0] = 1, doit(u);
	Next(i, u)
	{
		int v = e[i].v;
		if(vis[v]) continue;
		dp[0] = n, sum = size[v], root = 0;//就是这里的sum赋值
		getroot(v, u), solve(root);
	}
}

然后求重心的函数倒是看得懂,只是sum的赋值为啥是直接赋为子节点的size,这个size数组不是还没有更新吗。然后我模板就一直T。然后我就按照自己的理解方式求重心,就过了。一下是我自己的求重心方式。

inline void Getsize(int u,int fa){
	sz[u]=1;
	for(int i=head[u];i;i=e[i].nxt)
	{
		int v=e[i].v;
		if(v==fa||del[v])continue;
		Getsize(v,u);
		sz[u]+=sz[v];
	}
}
inline pair<int,int> Getp(int u,int fa,int rt){
	int Max=0;
	pair<int,int> tmp;
	tmp.second=INF;
	for(int i=head[u];i;i=e[i].nxt)
	{
		int v=e[i].v;
		if(v==fa||del[v])continue;
		pair<int,int> res=Getp(v,u,rt);
		if(res.second<tmp.second)tmp=res;
		Max=max(Max,sz[v]);
	}
	Max=max(Max,sz[rt]-sz[u]);
	if(Max<tmp.second)tmp={u,Max};
	return tmp;
}
inline void getrt(int p){
	Getsize(p,0);
	rt=Getp(p,0,p).first;
}
inline void getall(int u){
	del[u]=1;calc(u);
	for(int i=head[u];i;i=e[i].nxt) {
		if(del[e[i].v])continue;
		getrt(e[i].v);getall(rt);
	}
}

所以是我理解错题解意思了,还是??

在这里请教大佬

2023/12/1 16:13
加载中...