题目链接

题目

题目描述

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\) 不选被父节点覆盖/选/不选被孩子覆盖时的最小选点数。有转移方程:

\[\left \{
\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的更多相关文章

  1. [USACO 2008 Jan. Silver]架设电话线 —— 最短路+二分

    一道图论的最短路题.一开始连最短路都没想到,可能是做的题太少了吧,完全没有思路. 题目大意: FJ的农场周围分布着N根电话线杆,任意两根电话线杆间都没有电话线相连.一共P对电话线杆间可以拉电话线,第i ...

  2. POJ 3659 Cell Phone Network(树的最小支配集)(贪心)

    Cell Phone Network Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6781   Accepted: 242 ...

  3. Usaco 2019 Jan Platinum

    Usaco 2019 Jan Platinum 要不是昨天老师给我们考了这套题,我都不知道usaco还有铂金这么一级. 插播一则新闻:杨神坚持认为铂金比黄金简单,原因竟是:铜 汞 银 铂 金(金属活动 ...

  4. 【题解】晋升者计数 Promotion Counting [USACO 17 JAN] [P3605]

    [题解]晋升者计数 Promotion Counting [USACO 17 JAN] [P3605] 奶牛们又一次试图创建一家创业公司,还是没有从过去的经验中吸取教训.!牛是可怕的管理者! [题目描 ...

  5. 树的最小支配集 E - Cell Phone Network POJ - 3659 E. Tree with Small Distances

    E - Cell Phone Network POJ - 3659 题目大意: 给你一棵树,放置灯塔,每一个节点可以覆盖的范围是这个节点的所有子节点和他的父亲节点,问要使得所有的节点被覆盖的最少灯塔数 ...

  6. 树形dp compare E - Cell Phone Network POJ - 3659 B - Strategic game POJ - 1463

    B - Strategic game POJ - 1463   题目大意:给你一棵树,让你放最少的东西来覆盖所有的边   这个题目之前写过,就是一个简单的树形dp的板题,因为这个每一个节点都需要挺好处 ...

  7. USACO翻译:USACO 2012 JAN三题(2)

    USACO 2012 JAN(题目二) 一.题目概览 中文题目名称 叠干草 分干草 奶牛联盟 英文题目名称 stacking baleshare cowrun 可执行文件名 stacking bale ...

  8. USACO翻译:USACO 2012 JAN三题(1)

    USACO 2012 JAN(题目一) 一.题目概览 中文题目名称 礼物 配送路线 游戏组合技 英文题目名称 gifts delivery combos 可执行文件名 gifts delivery c ...

  9. USACO翻译:USACO 2013 JAN三题(1)

    USACO 2013 JAN 一.题目概览 中文题目名称 镜子 栅栏油漆 奶牛排队 英文题目名称 mirrors paint lineup 可执行文件名 mirrors paint lineup 输入 ...

  10. USACO翻译:USACO 2014 JAN三题(2)

    USACO 2014 JAN 一.题目概览 中文题目名称 队伍平衡 滑雪录像 滑雪场建设 英文题目名称 bteams recording skicourse 可执行文件名 bteams recordi ...

随机推荐

  1. 聊一聊数字孪生与3D可视化

    前言 在当代科技发展的背景下,数字孪生和3D可视化技术逐渐成为各行业的关键工具和解决方案.数字孪生是一种将实物事物与数字模型相结合的概念,通过将物理世界和数字世界实时连接,创造出一个对实体进行虚拟建模 ...

  2. 基于python+django的家教预约网站-家教信息管理系统设计与实现

    该系统是基于python+django开发的家教预约网站.是给师妹做的课程作业.大家在学习过程中,遇到问题可以在github给作者留言. 效果演示 前台地址: http://jiajiao.gitap ...

  3. 基于OpenJDK部署clickhouse-local镜像的快捷方法

    基于OpenJDK部署clickhouse-local镜像的快捷方法 摘要 前期搭建了一套基于OpenJDK的Clickhouse的服务端的镜像 可以简单使用dbeaver进行连接与使用. 后来发现需 ...

  4. [转帖] Jmeter学习笔记(七)——监听器元件之察看结果树

    https://www.cnblogs.com/pachongshangdexuebi/p/11507289.html 在jmeter中,如果我们需要查看请求结果就需要添加查看结果树,这个监听器元件有 ...

  5. [转帖]Jmeter学习笔记(二十三)——生成HTML性能报告

    https://www.cnblogs.com/pachongshangdexuebi/p/11759316.html 有时候我们写性能报告的时候需要一些性能分布图,JMeter是可以生成HTML性能 ...

  6. [转帖]超线程 Smt 究竟可以快多少?

    https://www.51cto.com/article/686171.html 刚才我们关闭SMT是把CPU10-CPU19全关了,只留下每对里面的1个CPU,也就是留下了CPU0-CPU9. 默 ...

  7. [转帖]mvcc多版本并发控制的原理

      https://baijiahao.baidu.com/s?id=1751185558149315946 MVCC多版本并发控制的原理:通过undo_log多版本链条,加上开启事务时产生的read ...

  8. [转帖]tubostat

    TURBOSTAT(8) System Manager's Manual TURBOSTAT(8) NAME turbostat - Report processor frequency and id ...

  9. TypeScript 类型增强declare的使用

    类型增强 declare 的使用 1.如果一个有一个全局变量 golabaol . 在index.html中. 2.我们在xx.vue中使用 golabaol .这个时候会报错 找不到名称" ...

  10. 改变promise状态有三种resolve、reject、throw

    let p = new Promise((resolve, reject) => { // 改变Promise的状态由三种 // resolve('第一种成功1'); // reject('第一 ...