题目链接

题目

题目描述

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. spring-transaction源码分析(2)EnableTransactionManagement注解

    概述(Java doc) 该注解开启spring的注解驱动事务管理功能,通常标注在@Configuration类上面用于开启命令式事务管理或响应式事务管理. @Configuration @Enabl ...

  2. Laravel - 虚拟主机引入静态资源

    一. 注意: 引用的静态文件要放在根目录,不要放在assets目录下 二. 引入方法 1.  模板中引入 css      <link rel="stylesheet" hr ...

  3. sql server 数据恢复

    1) 备份当前数据库的事务日志:BACKUP LOG [数据库名] TO disk= N'备份文件名' WITH NORECOVERY 2) 恢复一个误删除之前的完全备份:RESTORE DATABA ...

  4. [转帖]给我一分钟,让你彻底明白MySQL聚簇索引和非聚簇索引

    https://zhuanlan.zhihu.com/p/142139541 MySQL的InnoDB索引数据结构是B+树,主键索引叶子节点的值存储的就是MySQL的数据行,普通索引的叶子节点的值存储 ...

  5. [转帖]MySQL 8.0 以后的版本策略变化

    https://www.modb.pro/db/1717815842220630016 产品版本变更   从2023年7月18日开始,MySQL官网出现了一个新的版本 MySQL 8.1.0,直接改变 ...

  6. [转帖]深入理解mysql-第六章 mysql存储引擎InnoDB的索引-B+树索引

    一.引入索引 在没有索引的情况下,不论是根据主键列或者其他列的值进行查找,由于我们并不能快速的定位到记录所在的页,所以只能从第一个页沿着双向链表一直往下找,因为要遍历所有的数据页,时间复杂度就是O(n ...

  7. Tidb异名恢复Mysql数据库的过程

    Tidb异名恢复Mysql数据库的过程 背景 先说坑: TiDB备份恢复的方式 1. mysqldump + mysql source 的方式. 2. mydumper + loader tidb 的 ...

  8. [转帖]分享一个Navicat16最新版永久试用的办法

    https://zhuanlan.zhihu.com/p/614621302 新建bat,就叫 navicat无限试用.bat @echo off echo Delete HKEY_CURRENT_U ...

  9. [转帖] Strace的介绍与使用

    https://www.cnblogs.com/skandbug/p/16264609.html Strace简介 strace命令是一个集诊断.调试.统计于一体的工具,常用来跟踪进程执行时的系统调用 ...

  10. SMEE 国内最新光刻机