树的重心
树的重心
定义:
重心是指树中的一个结点,如果将这个点删除后,剩余各个连通块中点数的最大值最小,那么这个节点被称为树的重心。
不妨设max_part(x)为在删除节点x后产生的子树中,最大的一颗大小。那么树的重心就是使得max_part函数取到最小的节点p就是整颗树的重心。
void dfs(int x)
{
v[x] = 1; size[x] = 1; //设置子树的大小;
int max_part = 0; //表示删除x后最大子树的大小;
for (int i = head[x]; i; i = ne[i])
{
int y= ver[i];
if (v[y]) continue; //点y已经被访问过了;
dfs(y);
size[x] += size[y]; //从子节点更新到父节点
max_part = max(max_part, size[y]);
}
max_part = max(max_part, n - size[x]);
if (max_part < ans ) {
ans = max_part; //全局量记录重心对应的max_part
pos = x; //全局量pos记录重心;
}
}
图里联通块计数
本质上还是图着色,这里用cnt表示不同的颜色。
void dfs(int x)
{
v[x] = cnt;
for (int i = head[x]; i; i = ne[i]) {
int y = ver[i];
if (v[y]) continue;
dfs(y);
}
}
//依次着色森林;
for (int i = 1; i <= n; i++) {
if (!v[i]) {
cnt++;
dfs(i);
}
}
参考
- 算法进阶指南
- ACwing
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】