尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

树的重心

树的重心
📅 发布时间:2026/6/18 5:14:45

首先 \(n\) 为奇数所以只有一个重心 \(rt\),以它为根,对于 \(x \neq rt\),若 \(x\) 成为割掉某边后的重心,则这条边一定不在 \(x\) 子树内,设割掉后另一子树大小为 \(S\),记 \(g_x = \max_{y \in son_x} sz_y\),则有两个限制:

\[2 \times (n - S - sz_x) \le n - S \]

\[2 \times g_x \le n - S \]

得到:

\[n - 2sz_x \le S \le n - 2g_x \]

且要求边不在 \(x\) 子树内,数据结构维护即可。

\(x = rt\) 可以在 dfs 途中处理。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
// typedef __int128 i128;
typedef pair<int, int> pii;
const int N = 3e5 + 10, mod = 998244353;
template<typename T>
void dbg(const T &t) { cout << t << endl; }
template<typename Type, typename... Types>
void dbg(const Type& arg, const Types&... args) {#ifdef ONLINE_JUDGEreturn ;#endifcout << arg << ' ';dbg(args...);
}   
struct Query {int t, l, r;
};
int T, n, cg, sz[N], g[N], dfn[N], idx, m1, m2, in[N];
ll ans;
vector<int>e[N];
vector<Query>q[N];
struct Fenwick {int tr[N];#define lowbit(x) (x & -x)void clear() { for (int i = 1; i <= n; i++) tr[i] = 0; }void add(int x, int v) {if (!x) return ;while (x <= n) {tr[x] += v;x += lowbit(x);}}int qry(int x) {if (x < 0) return 0;int res = 0;while (x) {res += tr[x];x -= lowbit(x);}return res;}int ask(int l, int r) {if (l > r) return 0;return qry(r) - qry(l - 1);}
} t1, t2;
inline void dfs1(int u, int fa) {sz[u] = 1; g[u] = 0;dfn[u] = ++idx;for (auto v : e[u]) if (v != fa) {dfs1(v, u);sz[u] += sz[v];g[u] = max(g[u], sz[v]);}if (!cg && max(g[u], n - sz[u]) * 2 <= n) cg = u;
}
inline void dfs2(int u, int fa) {t1.add(sz[fa], -1);t1.add(n - sz[u], 1);if (u != cg) {int l = n - sz[u] * 2, r = n - g[u] * 2;ans += (ll)u * (t1.ask(l, r) + t2.ask(l, r));if (in[fa]) in[u] = 1;if (in[u]) ans += cg * (sz[u] <= n - sz[m2] * 2);else ans += cg * (sz[u] <= n - sz[m1] * 2);}t2.add(sz[u], 1);for (auto v : e[u]) if (v != fa) {dfs2(v, u);}t1.add(sz[fa], 1);t1.add(n - sz[u], -1);if (u != cg) {int l = n - sz[u] * 2, r = n - g[u] * 2;ans -= (ll)u * t2.ask(l, r);}
}
// 这里有个猎奇的点,就是 cg 为根的时候本来给 0 加一是会出问题的,但是这里由于 sz[0] = 0 恰好抵消了,当然我的意思是 xht 的写法是对的,因为 BIT 里给 x++ 了,但是不加还是会似 
int main() {// freopen("data.in", "r", stdin);// freopen("data.out", "w", stdout);ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);cin >> T;while (T--) {ans = 0;cin >> n;cg = m1 = m2 = 0;t1.clear(); t2.clear();for (int i = 1; i <= n; i++) e[i].clear(), q[i].clear(), in[i] = 0;for (int i = 1, u, v; i < n; i++) {cin >> u >> v;e[u].push_back(v); e[v].push_back(u);}dfs1(1, 0);idx = 0;dfs1(cg, 0);for (auto v : e[cg]) {if (sz[v] > sz[m1]) m2 = m1, m1 = v;else if (sz[v] > sz[m2]) m2 = v;}in[m1] = 1;for (int i = 1; i <= n; i++) t1.add(sz[i], 1);dfs2(cg, 0);cout << ans << '\n';}return 0;
}

相关新闻

  • Obsidian Tasks插件终极指南:5步构建高效任务管理系统
  • AzerothCore魔兽世界服务器:3分钟搭建完整开发环境终极指南
  • NGO-LSTM回归预测:北方苍鹰算法优化长短期记忆神经网络的数据预测模型

最新新闻

  • 2026高速冷冻离心机高品质制造厂商:全流程质检保障离心转速精度 - 品牌推荐大师
  • 05 | 一不小心就死锁了,怎么办?
  • 网课记笔记写论文刷题,哪些学生平板推荐能覆盖全部学习场景? - 资讯速览
  • 基于Springboot2+vue2的高校办公室行政事务管理系统
  • 百度网盘下载神器pdown:免登录高速下载终极指南
  • 广州二手包包变现避坑指南 全渠道实测,优质回收品牌实力盘点 - 奢侈品回收测评

日新闻

  • 2026年不锈钢卷板厂家推荐排行榜:冷轧热轧/304/201不锈钢卷板,高颜值耐腐蚀源头厂家实力精选 - 企业推荐官【官方】
  • FLUX.1-dev FP8模型实战指南:24GB以下显卡高效部署方案
  • 2026佛山长途搬家价目表:跨省跨市搬家费用完整计算指南 - 从来都是英雄出少年

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号