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】(经典)
<题目链接> 题目大意:给你一棵树,任意去除某一个点后,树被分成了几个联通块,则该点的平衡值为所有分成的连通块中,点数最大的那个,问你:该树所有点中,平衡值最小的那个点是什么? 解题分析: ...
随机推荐
- Jquery | 基础 | 慕课网 | 元素选择器
getElementsByTagName方法得到页面所有的<div>元素 var divs = document.getElementsByTagName('div'); 与 同样的效果, ...
- HDU - 6058 Kanade's sum
Bryce1010模板 http://acm.hdu.edu.cn/showproblem.php?pid=6058 /* 思路是:找出每个x为第k大的区间个数有多少 用pos[i]保存当前x的位置, ...
- 接口测试_RESTClient基本使用
火狐浏览器插件RESTClient基本使用. 消息头: Content-Type : application/x-www-form-urlencoded
- No space left on device
No space left on device 数据库无法启动, 发现是内存没有清空导致. 处理过程: ipcs ipcrm
- PHP实现XML传输
sendXML.php <!--发送XML的页面--> <?php $xml_data = '<xml>...</xml>';//发送的xml $url ...
- maven编译报错 -source 1.5 中不支持 lambda(或diamond) 表达式,编码 UTF-8 的不可映射字符
在用maven编译项目是由于项目中用了jdk 1.8, 编译是报错 -source 1.5 中不支持 lambda 表达式. 错误原因: Maven Compiler 插件默认会加 -source ...
- cordova应用使用手机调试
对于cordova应用的调试,最方便调试方式还是作为h5应用在浏览器来调试,调试好了再打包cordova应用和打包apk.然而h5应用时的效果跟最终在安卓手机运行还有少数情况会不一样,因此,也需要有能 ...
- Java Web MVC实例
开发环境 Eclipse Java EE IDE for Web Developers. Version: Luna Service Release 2 (4.4.2) tomcat:7.0 数据库: ...
- ICEcoder显示汉字出现乱码的处理
在网上看到icecoder这个小东西,是一个基于web的编辑器,很不错.唯一的缺点是打开的文件中汉字会变成乱码. 经查看源代码,在lib/file-control.php中,第89行是: echo ' ...
- (2)Ngixn 编译安装设置开机自启
设置nginx开机自启 #!/bin/sh # # nginx - this script starts and stops the nginx daemon # # chkconfig: - 85 ...