社区讨论
蒟蒻关于点分治找重心的一个小问题
P3806【模板】点分治参与者 10已保存回复 17
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 17 条
- 当前快照
- 1 份
- 快照标识符
- @mi7pootj
- 此快照首次捕获于
- 2025/11/21 01:34 4 个月前
- 此快照最后确认于
- 2025/11/21 01:53 4 个月前
对于这样的一张图:

以第一篇题解为例:
CPPvoid solve(int u)
{
//judge[i]表示到根距离为i的路径是否存在
vis[u]=judge[0]=1; calc(u);//处理以u为根的子树
for(int i=head[u];i;i=E[i].nxt)//对每个子树进行分治
{
int v=E[i].v;
if(vis[v])continue;
sum=size[v]; maxp[rt=0]=inf;
getrt(v,0); solve(rt);//在子树中找重心并递归处理
}
}
maxp[rt]=sum=n;//第一次先找整棵树的重心
getrt(1,0);
solve(rt);//对树进行点分治
getrt(1,0)中, 可以求出重心为2号结点.但是在
CPPsolve函数前面的计算执行完之后的过程中:sum = size[v]; maxp[rt = 0] = inf;
getrt(v, 0); solve(rt);
若
v为1, 因为一开始getrt(1, 0)相当于算出以1为根时各个节点的size, 那么此时的size[v]仍为13.这与点分治的思路并不相符(此时正确的
size[1]应当为以2为根时的size, 即6), 很有可能导致接下来递归求重心的过程中出现错误.但是我看很多题解都是这么打的, 请问一下dalao们, 这样做的缘由是什么?
回复
共 17 条回复,欢迎继续交流。
正在加载回复...