树形结构 —— 树与二叉树 —— 树的重心
生活随笔
收集整理的這篇文章主要介紹了
树形结构 —— 树与二叉树 —— 树的重心
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【概述】
樹的重心也叫樹的質心,對于一棵具有 n 個結點的無根樹,找到一個點,使得將樹變為以該點為根的有根樹時,最大子樹的結點數最小。
簡單來說,就是給定一棵 n 個點的樹,當刪除某點 x 后,使得最大連通塊最小,此時點 x 即為樹的重心。
相關性質:
樹的重心同樣可以用 dfs 來求,設 size[i] 表示以 i 為根的子樹的總大小,mson 表示以 i 為根的最大子樹的大小,然后利用 dfs 維護這兩個數組即可
最后只需要求所有的 max(n-size[x], mson[x]) 的最小值即為以 x 為根時最大子樹的大小,其中 n-size[x] 代表刪去 x 及其子樹后的連通塊大小
【實現】
struct Edge {int to, val;int next;Edge() {}Edge(int to, int val, int next) : to(to), val(val), next(next) {} } edge[N]; int n; int head[N], tot; int size[N], mson[N]; int core, minBalance = INF; void addEdge(int from, int to, int val) {edge[++tot].to = to;edge[tot].val = val;edge[tot].next = head[from];head[from] = tot; } void dfs(int x, int father) {size[x] = 1;mson[x] = 0;for (int i = head[x]; i != -1; i = edge[i].next) {int y = edge[i].to;if (y == father)continue;dfs(y, x);size[x] += size[y];mson[x] = max(mson[x], size[y]);}mson[x] = max(n - size[x], mson[x]);if (mson[x] < minBalance) {core = x;minBalance = mson[x];} } int main() {scanf("%d", &n);memset(head, -1, sizeof(head));for (int i = 1; i <= n - 1; i++) {int x, y, val;scanf("%d%d%d", &x, &y, &val);addEdge(x, y, val);addEdge(y, x, val);}dfs(1, 0);printf("%d %d\n", core, minBalance);return 0; }?
總結
以上是生活随笔為你收集整理的树形结构 —— 树与二叉树 —— 树的重心的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 理论基础 —— 线性表
- 下一篇: 01串(51Nod-1391)