社区讨论

蒟蒻关于点分治找重心的一个小问题

P3806【模板】点分治参与者 10已保存回复 17

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
17 条
当前快照
1 份
快照标识符
@mi7pootj
此快照首次捕获于
2025/11/21 01:34
4 个月前
此快照最后确认于
2025/11/21 01:53
4 个月前
查看原帖
对于这样的一张图:
graph
以第一篇题解为例:
CPP
void 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号结点.
但是在solve函数前面的计算执行完之后的过程中:
CPP
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们, 这样做的缘由是什么?
(如果要打我的脸的话请轻一点emm)

回复

17 条回复,欢迎继续交流。

正在加载回复...