洛谷题单指南-图论之树-P1395 会议
原题链接:https://www.luogu.com.cn/problem/P1395
题意解读:在一棵树中找一个点,使得该点到其他点距离之和最小,所有点之间边长度为1。
解题思路:要计算与所有点距离之和最小的,需要因此树的重心的概念。
树的重心
定义
树的重心也称为树的质心。对于一棵无根树,如果选择一个节点作为根节点,会将树转化为有根树。此时,每个节点都有若干棵子树,我们定义一个
点的 “最大子树节点数” 为该节点所有子树中节点数量的最大值。树的重心就是使得 “最大子树节点数” 最小的那个节点。也就是说,当我们删除这个
点时,剩余各个连通块中节点数最多的那个连通块的节点数达到最小。
性质
存在性:任何树至少有一个重心,最多有两个重心。如果树有两个重心,它们一定是相邻的。
平衡性:删除重心后,剩下的子树的大小不会超过原树大小的一半。
距离和最小:树中所有节点到重心的距离之和是最小的。如果树有两个重心,那么所有节点到这两个重心的距离之和相等。
增减叶子节点:在一棵树中添加或删除一个叶子节点,树的重心最多只会移动一条边的距离。
求解思路
可以使用深度优先搜索(DFS)来求解树的重心。基本步骤如下:
任选一个节点作为根节点,对树进行深度优先遍历;
在遍历过程中,对于每个节点,计算以它为根的子树的节点数量;
同时,计算删除该节点后,剩余各个连通块中节点数的最大值;
遍历完所有节点后,找出使得这个最大值最小的节点,即为树的重心。
回到此题,分两步即可解决:
1、从任意点开始,通过一次dfs找到树的重心
2、从重心开始dfs,计算到所有点的距离之和
100分代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 50005;
vector<int> g[N];
int n;
int c; //重心
int minmaxw = INT_MAX; //删除某节点后,剩余最大子树节点数的最小值
int sz[N]; //sz[u]表示以u为根的子树的节点数
int ans;
//求重心
void dfs1(int u, int parent)
{
sz[u] = 1; //当前u节点所在子树个数,初始化1,u自己
int maxw = 0; //删除u后所有子树节点数最大值
for(auto v : g[u]) //枚举删除u后的所有子树
{
if(v == parent) continue;
dfs1(v, u); //递归计算所有子树的节点数
sz[u] += sz[v]; //累加u子树节点数
maxw = max(maxw, sz[v]); //记录删除u后所有子树最大节点数
}
maxw = max(maxw, n - sz[u]); //n - sz[u]是除u子树之外的子树节点数,前面已经遍历过的
if(maxw < minmaxw || maxw == minmaxw && u < c)
{
minmaxw = maxw;
c = u; //记录序号较小的重心
}
}
//从u出发,计算到所有点的距离之和
void dfs2(int u, int parent, int depth)
{
ans += depth;
for(auto v : g[u])
{
if(v == parent) continue;
dfs2(v, u, depth + 1);
}
}
int main()
{
cin >> n;
int u, v;
for(int i = 1; i < n; i++)
{
cin >> u >> v;
g[u].push_back(v);
g[v].push_back(u);
}
dfs1(1, 0);
dfs2(c, 0, 0);
cout << c << " " << ans;
return 0;
}
如果节点带权,对于重心的应用可以参考:https://www.cnblogs.com/jcwy/p/18075408
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?
2024-03-04 洛谷题单指南-搜索-P1443 马的遍历
2024-03-04 洛谷题单指南-搜索-P2392 kkksc03考前临时抱佛脚
2024-03-04 洛谷题单指南-搜索-P1219 [USACO1.5] 八皇后 Checker Challenge
2024-03-04 洛谷题单指南-二分查找与二分答案-P3743 kotori的设备