日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

树形结构 —— 树与二叉树 —— 树的重心

發布時間:2025/3/17 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 树形结构 —— 树与二叉树 —— 树的重心 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【概述】

樹的重心也叫樹的質心,對于一棵具有 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; }

    ?

    總結

    以上是生活随笔為你收集整理的树形结构 —— 树与二叉树 —— 树的重心的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。