按照点分治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);
}
}
所以是我理解错题解意思了,还是??
在这里请教大佬