NC24953 [USACO 2008 Jan G]Cell Phone Network
题目
题目描述
Farmer John has decided to give each of his cows a cell phone in hopes to encourage their social interaction. This, however, requires him to set up cell phone towers on his N (1 ≤ N ≤ 10,000) pastures (conveniently numbered 1..N) so they can all communicate.
Exactly N-1 pairs of pastures are adjacent, and for any two pastures A and B (1 ≤ A ≤ N; 1 ≤ B ≤ N; A ≠ B) there is a sequence of adjacent pastures such that A is the first pasture in the sequence and B is the last. Farmer John can only place cell phone towers in the pastures, and each tower has enough range to provide service to the pasture it is on and all pastures adjacent to the pasture with the cell tower.
Help him determine the minimum number of towers he must install to provide cell phone service to each pasture.
输入描述
- Line 1: A single integer: N
- Lines 2..N: Each line specifies a pair of adjacent pastures with two space-separated integers: A and B
输出描述
- Line 1: A single integer indicating the minimum number of towers to install
示例1
输入
5
1 3
5 2
4 3
3 5
输出
2
说明
The towers can be placed at pastures 2 and 3 or pastures 3 and 5.
题解
知识点:树形dp。
题目要求用最少的点覆盖所有点,一个点能覆盖周围的点(最少支配集),所以有如下情况。
以 \(1\) 为根,设 \(dp[u][0/1/2]\) 为以 \(u\) 为根节点的子树且 \(u\) 不选被父节点覆盖/选/不选被孩子覆盖时的最小选点数。有转移方程:
\begin{array}{l}
dp[u][0] = \sum \min(dp[v_i][1],dp[v_i][2])\\
dp[u][1] = \sum \min(dp[v_i][0],dp[v_i][1],dp[v_i][2]) + 1\\
dp[u][2] = \sum \min(dp[v_i][1],dp[v_i][2]) + \min (delta,\max (dp[v_i][1]-dp[v_i][2],0))
\end{array}
\right .
\]
第一种情况,因为 \(u\) 没选被父节点覆盖,可以从子节点自己选了和子节点被子节点覆盖的情况转移。
第二种情况,\(u\) 选了那子节点所以都可以,最后加一。
第三种情况比较复杂,因为 \(u\) 要被子节点覆盖,而子节点只要有至少一个选了即可,因此先从子节点选了和没选但被子节点覆盖的情况转移最小值,即 \(\sum \max(dp[v_i][1],dp[v_i][2])\) 。当然,现在的最优解可能全是不选的,所以考虑所有子节点中选了减不选的差值最小的一组换掉,就有保证有选的情况,且是最优结果。特别地,如果本来就有至少一组是选了的情况,则 \(dp[v_i][1]-dp[v_i][2] <0\) ,这种情况 \(delta\) 应该为 \(0\) 表示不用改,所以 \(delta\) 最小不能小于 \(0\) ,最后 \(\min (delta,\max (dp[v_i][1]-dp[v_i][2],0))\) 。
时间复杂度 \(O(n)\)
空间复杂度 \(O(n)\)
代码
#include <bits/stdc++.h>
using namespace std;
vector<int> g[10007];
int dp[10007][3];
///0:u不选但被父节点覆盖,则1,2
///1:u选,则0,1,2
///2:u不选但被孩子覆盖,孩子只要有选一个就行,其他随意
///因此如果最小情况(即1,2最小值)已经有选了(即1更小)就不变,否则找到差值最小的一组
void dfs(int u, int fa) {
int delta = 1e9;///选-不选的差值,没有孩子则不可能被孩子覆盖无穷大
for (auto v : g[u]) {
if (v == fa) continue;
dfs(v, u);
dp[u][0] += min(dp[v][1], dp[v][2]);
dp[u][1] += min({ dp[v][0], dp[v][1], dp[v][2] });
dp[u][2] += min(dp[v][1], dp[v][2]);
delta = min(delta, max(dp[v][1] - dp[v][2], 0));///如果存在小于0的说明肯定有选的那就改为0不变,否则找到差值最小的一组改掉
}
dp[u][1]++;
dp[u][2] += delta;
}
int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int n;
cin >> n;
for (int i = 1;i < n;i++) {
int u, v;
cin >> u >> v;
g[u].push_back(v);
g[v].push_back(u);
}
dfs(1, 0);
cout << min(dp[1][1], dp[1][2]) << '\n';///根节点不可能有0
return 0;
}
NC24953 [USACO 2008 Jan G]Cell Phone Network的更多相关文章
- [USACO 2008 Jan. Silver]架设电话线 —— 最短路+二分
一道图论的最短路题.一开始连最短路都没想到,可能是做的题太少了吧,完全没有思路. 题目大意: FJ的农场周围分布着N根电话线杆,任意两根电话线杆间都没有电话线相连.一共P对电话线杆间可以拉电话线,第i ...
- POJ 3659 Cell Phone Network(树的最小支配集)(贪心)
Cell Phone Network Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6781 Accepted: 242 ...
- Usaco 2019 Jan Platinum
Usaco 2019 Jan Platinum 要不是昨天老师给我们考了这套题,我都不知道usaco还有铂金这么一级. 插播一则新闻:杨神坚持认为铂金比黄金简单,原因竟是:铜 汞 银 铂 金(金属活动 ...
- 【题解】晋升者计数 Promotion Counting [USACO 17 JAN] [P3605]
[题解]晋升者计数 Promotion Counting [USACO 17 JAN] [P3605] 奶牛们又一次试图创建一家创业公司,还是没有从过去的经验中吸取教训.!牛是可怕的管理者! [题目描 ...
- 树的最小支配集 E - Cell Phone Network POJ - 3659 E. Tree with Small Distances
E - Cell Phone Network POJ - 3659 题目大意: 给你一棵树,放置灯塔,每一个节点可以覆盖的范围是这个节点的所有子节点和他的父亲节点,问要使得所有的节点被覆盖的最少灯塔数 ...
- 树形dp compare E - Cell Phone Network POJ - 3659 B - Strategic game POJ - 1463
B - Strategic game POJ - 1463 题目大意:给你一棵树,让你放最少的东西来覆盖所有的边 这个题目之前写过,就是一个简单的树形dp的板题,因为这个每一个节点都需要挺好处 ...
- USACO翻译:USACO 2012 JAN三题(2)
USACO 2012 JAN(题目二) 一.题目概览 中文题目名称 叠干草 分干草 奶牛联盟 英文题目名称 stacking baleshare cowrun 可执行文件名 stacking bale ...
- USACO翻译:USACO 2012 JAN三题(1)
USACO 2012 JAN(题目一) 一.题目概览 中文题目名称 礼物 配送路线 游戏组合技 英文题目名称 gifts delivery combos 可执行文件名 gifts delivery c ...
- USACO翻译:USACO 2013 JAN三题(1)
USACO 2013 JAN 一.题目概览 中文题目名称 镜子 栅栏油漆 奶牛排队 英文题目名称 mirrors paint lineup 可执行文件名 mirrors paint lineup 输入 ...
- USACO翻译:USACO 2014 JAN三题(2)
USACO 2014 JAN 一.题目概览 中文题目名称 队伍平衡 滑雪录像 滑雪场建设 英文题目名称 bteams recording skicourse 可执行文件名 bteams recordi ...
随机推荐
- idea 查看类的继承结构及其子类
转载请注明出处: 在idea中通过查看一个类或接口的继承结构,可以了解到整个相关功能设计的流程 idea中查看一个类或接口的继承结构的方法如下: 1.选中一个类:右键进入继承结构视图: 效果图如下:
- .NET静态代码织入——肉夹馍(Rougamo)发布2.2
肉夹馍(https://github.com/inversionhourglass/Rougamo)通过静态代码织入方式实现AOP的组件,其主要特点是在编译时完成AOP代码织入,相比动态代理可以减少应 ...
- Linux查看文件内容与处理文件
Linux查看文件内容与处理文件 目录 Linux查看文件内容与处理文件 查看文件内容 1.查看文件类型 2.查看整个文件 3.查看部分文件 处理文件 1.创建空文件 2.过滤文件内容 3.统计文件内 ...
- SD协议-状态机
1.SD卡状态回顾 2.SD卡数据传输模式 SD卡在接收到CMD3之后就会进入data transfer state,初始状态时standby state,表示空闲状态 SD卡在standby sta ...
- 文心一言 VS 讯飞星火 VS chatgpt (185)-- 算法导论14.1 2题
二.用go语言,对于图 14-1中的红黑树 T 和关键字 x.key 为35的结点x,说明执行 OS-RANK(T,x) 的过程. 文心一言: 在红黑树中,OS-RANK(T, x) 是一个操作,用于 ...
- Laravel - 使用ajax
一,前台模板文件 index.blade.php <!DOCTYPE html> <meta name="_token" content="{{ cs ...
- [转帖]HTTP状态码、请求方法、响应头信息
https://www.cnblogs.com/pachongshangdexuebi/p/5279608.html HTTP状态码 当浏览者访问一个网页时,浏览者的浏览器会向网页所在服务器发出请求. ...
- [转帖]FIO磁盘性能测试工具
https://www.cnblogs.com/lyhabc/p/16708771.html 简介 一般我们测试硬盘或者存储的性能的时候,会用Linux系统自带的dd命令,因为是自带命令,简单易使用, ...
- [转帖]Megacli 错误码
MegaCLI Error Messages 0x00 Command completed successfully 0x01 Invalid command 0x02 DCMD opcode is ...
- 【转帖】QUIC协议简史
QUIC简史 QUIC(Quick UDP Internet Connection)是谷歌推出的一套基于UDP的传输协议,它实现了TCP + HTTPS + HTTP/2的功能,目的是保证可靠性的同时 ...