#sXDPybttg050204. 1578:【例 4】战略游戏
1578:【例 4】战略游戏
好的,我将这道题整理为清晰的题面格式,并补充样例解释、数据范围与时空限制:
题目描述
Bob 喜欢玩电脑游戏,特别是战略游戏。但是他经常无法找到快速玩过游戏的方法。现在他有个问题。
现在他有座古城堡,古城堡的路形成一棵树。他要在这棵树的节点上放置最少数目的士兵,使得这些士兵能够瞭望到所有的路。
注意:某个士兵在一个节点上时,与该节点相连的所有边都将能被瞭望到。
请你编一个程序,给定一棵树,帮 Bob 计算出他最少要放置的士兵数。
输入格式
输入数据表示一棵树,描述如下:
- 第一行一个整数 ,表示树中节点的数目。
- 接下来 行,每行描述一个节点信息:
- 第一个整数 ,表示节点编号(从 到 );
- 第二个整数 ,表示后面有 条边与节点 相连;
- 接下来 个整数 ,分别是每条边所连接的节点编号。
对于一个有 个节点的树,节点标号在 到 之间,且在输入文件中每条边仅出现一次。
输出格式
输出仅包含一个整数,为所求的最少士兵数。
样例
样例输入
4
0 1 1
1 2 2 3
2 0
3 0
样例输出
1
样例解释
,树的结构如下(根据输入):
- 节点 0:连接节点 1
- 节点 1:连接节点 2 和节点 3
- 节点 2:无连接(实际上表示 k=0,即没有子节点)
- 节点 3:无连接
因此树形结构:
0 — 1 — 2
|
3
实际上节点 0 与节点 1 相连,节点 1 与节点 2 和节点 3 相连。
我们需要选择一些节点放置士兵,使得每条边都被覆盖(即每条边的至少一个端点有士兵)。
这是一个 树的最小点覆盖 问题。
在节点 1 放一个士兵,可以覆盖边 (0,1)、(1,2)、(1,3),所有边都被覆盖。
所以最少士兵数为 1。
数据范围
对于 的数据,。
时空限制
- 时间:
- 内存:
提示
此题为经典的 树的最小点覆盖 问题,可以用 树形 DP 解决。
状态定义:
- :表示在节点 不放置士兵时,以 为根的子树所需的最少士兵数;
- :表示在节点 放置士兵时,以 为根的子树所需的最少士兵数。
转移方程:
- 若 不放置士兵,则 的所有子节点 必须放置士兵(否则边 无法被覆盖):
- 若 放置士兵,则子节点 可放可不放,取较小值:$$dp[u][1] = 1 + \sum_{v \in \text{son}(u)} \min(dp[v][0], dp[v][1])$$
初始化:对于叶子节点,,。
最终答案为 ,其中 是树的根(可以任选,比如 0)。
复杂度 。