1. 题目背景与核心挑战解析
这道来自NOIP2012提高组的题目,描述了一个军队调度与疫情控制的经典场景。题目设定在一个由n个城市组成的树形国家网络中,首都位于节点1。当疫情在某个非首都城市爆发时,需要将军队调往特定城市进行封锁控制。每个军队都有固定的移动速度,且移动过程必须沿着唯一的树形路径行进。
核心难点在于:如何在有限时间内,通过最优的军队调度策略,实现用最少的军队数量完成对所有疫情爆发城市的控制。这涉及到树形结构的遍历、时间窗口计算、资源最优分配等多个算法知识点。
关键提示:树结构的特殊性决定了从首都到任何节点有且只有一条路径,这个性质将成为解题的重要突破口。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 算法思路拆解与选型
2.1 问题转化与建模
首先需要将实际问题转化为可计算的模型:
- 将城市网络抽象为带权树,边权代表城市间距离
- 军队移动速度统一为1单位距离/小时
- 控制时间限制为给定的T小时
- 每个军队必须在T小时内到达目标城市
通过这种转化,问题变为:在树结构上寻找一组从根节点出发的路径,使得所有指定节点都被覆盖,且每条路径长度不超过T。
2.2 贪心算法可行性分析
由于题目要求"最少军队数",这提示我们可以尝试贪心算法。具体思路是:
- 优先处理距离首都最远的疫情城市
- 为每个城市选择能够覆盖它的、且剩余可用时间最少的军队
- 确保每个军队的调度不冲突
这种策略的合理性在于:远端城市的选择余地更小,必须优先保证它们的覆盖。
2.3 二分答案法的引入
考虑到直接求解最优解较为困难,可以采用二分答案法:
- 确定可能的时间范围(0到最大可能时间)
- 对于每个猜测的时间T,验证是否存在可行解
- 通过二分逼近最小可行时间
这种方法将原问题转化为一系列判定问题,复杂度从O(n!)降为O(n logT)。
3. 具体实现步骤详解
3.1 数据结构准备
cpp复制struct Edge {
int to, length;
};
vector<vector<Edge>> tree; // 树的邻接表表示
vector<int> armies; // 军队初始位置
vector<bool> isInfected; // 标记感染城市
