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】(经典)
<题目链接> 题目大意:给你一棵树,任意去除某一个点后,树被分成了几个联通块,则该点的平衡值为所有分成的连通块中,点数最大的那个,问你:该树所有点中,平衡值最小的那个点是什么? 解题分析: ...
随机推荐
- redis优势
redis是高性能的key-value内存数据库. 由于是内存型的,所以性能相比磁盘数据库更加优秀. 由于支持丰富的数据类型,相比memcache更受开发者欢迎.列表和整形是最常用的数据类型. 就算对 ...
- Xcode7.1环境下上架iOS App到AppStore 流程 转
来自:http://www.cnblogs.com/ChinaKingKong/p/4957682.html 前言部分 之前App要上架遇到些问题到网上搜上架教程发现都是一些老的版本的教程 ,目前iT ...
- Python Unicode and str
http://stackoverflow.com/questions/18034272/python-str-vs-unicode-types unicode is a character set. ...
- Vijos p1688 病毒传递 树形DP
https://vijos.org/p/1688 看了下别人讨论的题解才想到的,不过方法和他的不同,感觉它的是错的.(感觉.感觉) 首先N只有1000, 如果能做到暴力枚举每一个节点,然后O(N)算出 ...
- D. Black Hills golden jewels 二分答案 + 二分判定
http://codeforces.com/gym/101064/problem/D 题目是给定一个数组,如果两两组合,有C(n, 2)种结果,(找出第一个大于等于第k大的结果) 思路, 二分答案va ...
- window上安装MySQL
一.安装MySQL 1.1 下载解压缩版的安装包,解压,然后配置环境变量 PATH=.......;D:\Program Files (x86)\mysql-5.5.27-win32\bin (注意是 ...
- QQ面板拖拽(慕课网DOM事件探秘)(下)
2.鼠标事件坐标获取 function fnDown(event) { var event = event || window.event; var oDrag = document.getEleme ...
- el-select,选择一行,取值行的对象.
<el-select v-model="set_invoice_form.InvoiceType" placeholder="请选择" :disabl ...
- spring @value 为什么没有获取到值
1.配置文件的路径没有扫描到 2.注解的bean 不是通过spring托管的.bean 要通过spring 注解,引用的时候要用@Autowired 自动注入的bean 不要用new 出来的bean ...
- Android获取声音长度
代码 MediaMetadataRetriever metaRetriever = new MediaMetadataRetriever(); metaRetriever.setDataSource( ...