- 重心定义:
重心是指树中的一个结点,如果将这个点删除后,剩余各个连通块中点数的最大值最小,那么这个节点被称为树的重心。
2.解决方案
- 使用dfs得到每一个节点 u u u的子树数目 c n t [ u ] cnt[u] cnt[u]。
- 去除该节点后的连通块最大值为 : r e s [ u ] = m a x ( n − c n t [ u ] , c n t [ v ] ) res[u] = max(n - cnt[u], cnt[v]) res[u]=max(n−cnt[u],cnt[v]) 其中v是u的临接点。
- 树的重心为 m a x ( r e s [ u ] ) max(res[u]) max(res[u])
- 代码
// 以U为根的子树的大小
int dfs(int u) {
int sum = 1, res = 0;
vis[u] = 1;
for (int v : G[u]) {
if (!vis[v]) {
int s = dfs(v);
res = max(res, s);
sum += s;
}
}
res = max(res, n - sum);
ans = min(ans, res);
// printf("%d %d\n", u, sum);
return sum;
}
使用的是邻接表法保存图。G的定义为vector<int>G[maxn]
无向图,加双向边。
- 题目
-
leecode5908
是重心的变形,题解在这。 -
模板题目 poj1655