树的重心
发布日期:2021-05-07 02:30:09 浏览次数:20 分类:精选文章

本文共 619 字,大约阅读时间需要 2 分钟。

问题引入

对于一棵 n n n个节点的无根树,找到一个点,使得把该树变成以该点为根的有根树时,最大子树的节点数最小(删除这个点后的最大连通块最小)

d ( i ) d(i) d(i)为以 i i i为根节点的子树个数,则:

d ( i ) = Σ d ( j ) + 1 d(i)=Σd(j)+1 d(i)=Σd(j)+1

若节点 i i i的子节点为 v v v,那么最后的答案就是使 m a x ( d ( v ) , n − d ( i ) ) max(d(v),n-d(i)) max(d(v),nd(i))最小的节点 i i i

代码

vector
G[maxn];int d[maxn];int n, ans = inf, id;int dfs(int u, int father) { //dfs(1,-1) d[u] = 1; for (auto v: G[u]) { if (v != father) d[u] += dfs(v, u); } int res = n - d[u]; for (auto v: G[u]) { if (v != father) res = max(res, d[v]); } if (ans > res) ans = res, id = u; return d[u];}
上一篇:ACM-ICPC 2018 南京赛区网络预赛 - J Sum(思维+欧拉筛)
下一篇:莫比乌斯函数

发表评论

最新留言

初次前来,多多关照!
[***.217.46.12]2025年03月23日 08时24分25秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章