POJ 3659 Cell phone Network (树的最小点覆盖, 树形DP)
题意:
给定一棵树,每个点可以覆盖自己和相邻的点, 求最少要多少个点覆盖图
#include <cstdio>
#include <cstring>
#include <iostream>
#include <vector>
using namespace std;
const int maxn = + ;
const int inf = ;
int N;
vector<int> G[maxn];
int deg[maxn];
int dp[maxn][];
int root = ;
//dp[u][0] //表示放,包括u及u的子树全部覆盖需要的最少结点数
//dp[u][1] //不放, 包括u及u子树全部覆盖需要的最少结点数
//dp[u][2] // 不放, 除了u,u的子树全被覆盖需要的最少结点数 //dp[u][0] += sum(min(dp[v][0], dp[v][1], dp[v][2]))
//放的话, 就所有状态都可以转移过来 //dp[u][1] = choose one child k use f[k][0], then sum up other children min(f[i][0], f[i][1]);
//因为u不能放, 但又要被覆盖, 说明至少有一个孩子是放的, 加上其他孩子取全部覆盖的值 //正常来说, dp[u][0]是要大于dp[u][1]的,但是如果u孩子全是叶子, 叶子是不可以被除u以外覆盖的,
//所以此时u的dp[u][1] 大于 dp[u][0]
//所以要判断是否有这种情况, 如果有的话, 那么这种情况加上dp[u][0],其他情况(dp[v][0] > dp[v][1])加上dp[v][1]
//否则的话挑选min(dp[v][0] * 1 + dp[v][1] * (child - 1)) //dp[u][2] += sum(dp[v][1])
//u不能被覆盖, 所以v不能放, 但v要被覆盖, 所以加上全部dp[v][1]的值 void dfs(int u, int pre) {
dp[u][] = ; //放的话, 初始化为1
dp[u][] = G[u].size() == && u != root ? inf : ; //叶子是不能在不放的时候全覆盖的, inf, 其他赋值0
dp[u][] = ; int minOne = inf;
int mustPut = ;//看一下是不是有必须放的孩子
for(int i = ; i < G[u].size(); i++) {
int v = G[u][i];
if(v == pre)
continue; //不访问自己父亲
dfs(v, u);
dp[u][] += min(dp[v][], min(dp[v][], dp[v][]));
// dp[u][2] += min(dp[v][0], dp[v][1]);
// if(dp[v][1] != inf)
if(dp[v][] >= dp[v][]) { //满足子树如果v不放的值比放还要大,说明放才是最优的
dp[u][] += dp[v][]; //直接从dp[v][0]推
mustPut = ;
} else { // v不放才是最优的
dp[u][] += dp[v][];//直接从dp[v][1]推
//那么选出最少的dp[v][0] - dp[v][1], 这个点就是放的那个孩子,其他都不放 minOne = min(minOne, dp[v][] - dp[v][]);
}
dp[u][] += dp[v][];
} if(!mustPut) { //如果不是有必须放的, 那么挑选最少值
dp[u][] += minOne;
//上面等式其实是选一个min(dp[v][0] * 1 + dp[v][1] * (child - 1))
}
}
int main() {
// freopen("input.txt", "r", stdin);
while(cin >> N) {
for(int i = ; i < maxn; i++)
G[i].clear();
for(int i = ; i < N - ; i++) {
int u, v;
cin >> u >> v;
G[u].push_back(v);
G[v].push_back(u);
}
dfs(root, -);
cout << min(dp[root][], min(dp[root][], dp[root][] + )) << "\n"; //注意要把2没放那个放上去 }
return ;
}
数据:
POJ 3659 Cell phone Network (树的最小点覆盖, 树形DP)的更多相关文章
- POJ 3659 Cell Phone Network (树dp)
题目链接:http://poj.org/problem?id=3659 给你一个树形图,一个点可以覆盖他周围连接的点,让你用最少的点覆盖所有的点. dp[i][0]表示用i点来覆盖,dp[i][1]表 ...
- POJ 3659 Cell Phone Network / HUST 1036 Cell Phone Network(最小支配集,树型动态规划,贪心)-动态规划做法
POJ 3659 Cell Phone Network / HUST 1036 Cell Phone Network(最小支配集,树型动态规划,贪心) Description Farmer John ...
- POJ 3659 Cell Phone Network(树的最小支配集)(贪心)
Cell Phone Network Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6781 Accepted: 242 ...
- POJ 3659 Cell Phone Network 最小支配集模板题(树形dp)
题意:有以个 有 N 个节点的树形地图,问在这些顶点上最少建多少个电话杆,可以使得所有顶点被覆盖到,一个节点如果建立了电话杆,那么和它直接相连的顶点也会被覆盖到. 分析:用最少的点覆盖所有的点,即为求 ...
- POJ - 3659 Cell Phone Network(树形dp---树的最小点支配集)
题意:有N个点,N-1条边,任意两点可达,由此形成了一棵树.选取一个点a,它可覆盖自己以及与自己相邻的点,选取尽量少的点a,使得树中所有点都被覆盖,即求树的最小点支配集. 分析: 1.对于每一个点cu ...
- HDU 1054 Strategic Game(最小点覆盖+树形dp)
题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=106048#problem/B 题意:给出一些点相连,找出最小的点数覆盖所有的 ...
- HDU - 1054 Strategic Game(二分图最小点覆盖/树形dp)
d.一颗树,选最少的点覆盖所有边 s. 1.可以转成二分图的最小点覆盖来做.不过转换后要把匹配数除以2,这个待细看. 2.也可以用树形dp c.匈牙利算法(邻接表,用vector实现): /* 用ST ...
- poj 1655 Balancing Act 求树的重心【树形dp】
poj 1655 Balancing Act 题意:求树的重心且编号数最小 一棵树的重心是指一个结点u,去掉它后剩下的子树结点数最少. (图片来源: PatrickZhou 感谢博主) 看上面的图就好 ...
- POJ 1655 Balancing Act (求树的重心)【树形DP】(经典)
<题目链接> 题目大意:给你一棵树,任意去除某一个点后,树被分成了几个联通块,则该点的平衡值为所有分成的连通块中,点数最大的那个,问你:该树所有点中,平衡值最小的那个点是什么? 解题分析: ...
随机推荐
- CentOS7下如何正确安装并启动Docker(图文详解)
我使用了CentOS 7操作系统,可以非常容易地安装Docker环境.假设,下面我们都是用root用户进行操作,执行如下命令进行准备工作: yum install -y yum-utils yum-c ...
- 洛谷1736(二维dp+预处理)
洛谷1387的进阶版,但很像. 1387要求是“全为1的正方形”,取dp[i][j] = min(dp[i-1][j-1], min(dp[i-1][j], dp[i][j-1]))吧?这个有“只有对 ...
- ES6中的Rest参数和默认参数
ES6中的Rest参数和默认参数 Rest参数 一个例子 编写一个函数, 用来判断, 某个字符串中, 是否其他的字符串, 如果第一参数以后的字符串, 都包含在第一参数中, 都包含在, 就返回true ...
- AIX系统常用命令
netstat -an | grep 9090 可以看到该端口正被监听,但却不知道是哪个进程占用了该端口 1. netstat -Aan|grep 端口号找到该端口连接对应的PCB/ADDR和连接的 ...
- OkHttp下载文件中途断网报Can't create handler inside thread that has not called Looper.prepare()异常的解决办法
最近做项目时出现个问题. 在一个基类中,创建一个Handler对象用于主线程向子线程发送数据,代码如下: this.mThirdHandler = new Handler(){ @Override p ...
- centos安装字体
cd /usr/local/fonts/zh_CN/TrueType/ cp /root/simsunb.ttf /usr/share/fonts/zh_CN/TrueType/ mkfontscal ...
- mac下安装nodejs
下载 https://nodejs.org/en/ 安装 一步步继续就ok 验证 npm -v node -v Done!
- 系统设计摘录CAP
系统架构设计理论与原则 这里主要介绍几种常见的架构设计理论和原则,常见于大中型互联系统架构设计. (一).CAP理论 1.什么是CAP 所谓CAP,即一致性(Consistency).可用性(Avai ...
- 最新精品 强势来袭 XP,32/64位Win7,32/64位Win8,32/64位Win10系统【国庆版版】
本系统是10月最新完整版本的Windows10 安装版镜像,Win10正式版,更新了重要补丁,提升应用加载速度,微软和百度今天宣布达成合作,百度成为Win10 Edge浏览器中国默认主页和搜索引擎,系 ...
- SQLite – 删除表
SQLite -删除表 SQLite DROP TABLE语句用于删除一个表定义和所有相关的数据,索引.触发器.约束和规范许可表. 你使用这个命令时必须小心,因为一旦一个表被删除然后表中所有可用的信息 ...