1 条题解
-
0
问题分析
本题要求k名特工在树上访问所有n个城市,每天只能有一个特工移动,每个城市只能被一个特工访问。目标是求最少天数。
关键洞察
1. 问题转化
将树划分为k个连通区域,每个区域包含一个特工的初始位置。特工只需访问自己区域内的所有节点。
2. 步数计算
对于包含m个节点的连通块,特工从起点s出发访问所有节点所需的最小步数为:
- 需要遍历所有m-1条边
- 最优策略是最后停留在离起点最远的点
- 步数 = 2×(m-1) - d,其中d是起点到连通块内最远点的距离
3. 总天数公式
总天数 = Σ[2×(m_i-1) - d_i] = 2×(n-k) - Σd_i
其中:
- m_i是第i个连通块的节点数
- d_i是第i个起点到其连通块内最远点的距离
核心思想
最小化总天数等价于最大化Σd_i
解决方案
算法步骤
-
Voronoi划分:以k个起点为中心,将树划分为k个区域,每个节点属于离它最近的起点
-
计算最远距离:对于每个Voronoi区域,计算起点到区域内最远点的距离d_i
-
结果计算:总天数 = 2×(n-k) - Σd_i
技术细节
- Voronoi划分:使用多源BFS,每个节点分配给距离最近的起点
- 最远距离计算:通过两次DFS(树形DP)计算:
- 第一次DFS:计算每个节点到子树内最远点的距离
- 第二次DFS:计算每个节点到整棵树最远点的距离
算法复杂度
- 时间复杂度:O(n)
- 空间复杂度:O(n)
样例验证
样例1
输入: 6 2 2 6 1-2, 2-3, 2-4, 4-5, 5-6 划分: - 特工1:城市1,2,3,4,最远距离2 - 特工2:城市5,6,最远距离1 计算:2×(6-2) - (2+1) = 8-3 = 5
样例2(链状结构)
n=500000,特工在1和n 答案:499998
样例3(星状结构)
n=500000,特工在1 答案:999997
正确性证明
- Voronoi划分最优性:每个节点分配给最近起点是最自然的划分方式
- 步数公式正确性:基于树遍历的最优策略推导
- 算法效率:线性复杂度处理大规模数据
优化要点
- 使用邻接表存储树结构
- 避免递归过深,可使用迭代DFS
- 注意整数溢出,使用long long
该解决方案能够高效处理题目给出的所有数据范围,包括n=500000的最大测试用例。
- 1
信息
- ID
- 3192
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 5
- 已通过
- 1
- 上传者