, 然后用双指针即可,具体见代码,O(n) 很快)
等等,不对啊~ 你这样求出的(a,b)有可能a--b并不经过u啊~ 这其实好办,只需要减去子树(例如A子树)中到u的距离和的点对个数即可....v[to])
{
dfs2(to, cur);
sz[cur] += sz[to];
}
}
}
void dfs1(int cur, int fa, int nn) //...dfs2(cur, fa); // 确定cur子树的大小sz[cur], 注意, 因为重心(即根节点)在不断变化中, 所以每次都要重新处理出sz来
dfs1(cur, fa, sz[cur]); /...但是显然,9998已经是叶子了, 不能再有任何子节点了. 所以!...最后讲两个点分治容易T的点
一旦被T,先打印一下你每次求出的重心(例如上面代码的102行之前). 就可以知道你求重心的代码是否写错.
一般不要在递归中写memset,容易被T.