题意:

给定一棵树,每个点可以覆盖自己和相邻的点, 求最少要多少个点覆盖图

#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)的更多相关文章

  1. POJ 3659 Cell Phone Network (树dp)

    题目链接:http://poj.org/problem?id=3659 给你一个树形图,一个点可以覆盖他周围连接的点,让你用最少的点覆盖所有的点. dp[i][0]表示用i点来覆盖,dp[i][1]表 ...

  2. POJ 3659 Cell Phone Network / HUST 1036 Cell Phone Network(最小支配集,树型动态规划,贪心)-动态规划做法

    POJ 3659 Cell Phone Network / HUST 1036 Cell Phone Network(最小支配集,树型动态规划,贪心) Description Farmer John ...

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

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

  4. POJ 3659 Cell Phone Network 最小支配集模板题(树形dp)

    题意:有以个 有 N 个节点的树形地图,问在这些顶点上最少建多少个电话杆,可以使得所有顶点被覆盖到,一个节点如果建立了电话杆,那么和它直接相连的顶点也会被覆盖到. 分析:用最少的点覆盖所有的点,即为求 ...

  5. POJ - 3659 Cell Phone Network(树形dp---树的最小点支配集)

    题意:有N个点,N-1条边,任意两点可达,由此形成了一棵树.选取一个点a,它可覆盖自己以及与自己相邻的点,选取尽量少的点a,使得树中所有点都被覆盖,即求树的最小点支配集. 分析: 1.对于每一个点cu ...

  6. HDU 1054 Strategic Game(最小点覆盖+树形dp)

    题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=106048#problem/B 题意:给出一些点相连,找出最小的点数覆盖所有的 ...

  7. HDU - 1054 Strategic Game(二分图最小点覆盖/树形dp)

    d.一颗树,选最少的点覆盖所有边 s. 1.可以转成二分图的最小点覆盖来做.不过转换后要把匹配数除以2,这个待细看. 2.也可以用树形dp c.匈牙利算法(邻接表,用vector实现): /* 用ST ...

  8. poj 1655 Balancing Act 求树的重心【树形dp】

    poj 1655 Balancing Act 题意:求树的重心且编号数最小 一棵树的重心是指一个结点u,去掉它后剩下的子树结点数最少. (图片来源: PatrickZhou 感谢博主) 看上面的图就好 ...

  9. POJ 1655 Balancing Act (求树的重心)【树形DP】(经典)

    <题目链接> 题目大意:给你一棵树,任意去除某一个点后,树被分成了几个联通块,则该点的平衡值为所有分成的连通块中,点数最大的那个,问你:该树所有点中,平衡值最小的那个点是什么? 解题分析: ...

随机推荐

  1. iOS 自建企业级应用(In-House)分发平台

    注意事项 自建分发平台,首先需要有一个可以提供下载功能的服务器,而且服务器需要支持HTTPS协议! 其实,使用七牛云就可以完成这些操作. 推荐方案 七牛云实践方案简述(感兴趣的朋友可以和我交流具体的实 ...

  2. iOS NavigationBar 导航栏自定义

    1. 设置导航栏NavigationBar的背景颜色: a)  setBarTintColor : 设置NagivationBar的颜色 也可以用 : [[UINavigationBar appear ...

  3. 跟我一起玩Win32开发(14):用对话框作为主窗口

    前面我们在编写Win32应用程序的思路都是: 1.设计窗口类.2.注册窗口类.3.创建窗口.…… 然而,当我们接触控件以后, 会发现一个问题,我们在窗口上放置控件实在不好弄,而资源中的对话框具有图形编 ...

  4. logrotate日志转储

    1 工具目录 ***系统开启selinux,logrotate会不生效*** linux默认会安装logrotate工具,自身的boot.log就是通过它分割转储的. [root@webmaster ...

  5. CH#56C(LCA+dfs序)

    题目传送门 性质是:把节点dfs序以后,异象石按这个序号排序,然后相邻两两求树上距离,这些距离的和除以二就是最小斯坦纳树. 插入删除的具体操作是根据我们上述性质,用一个set维护dfn,比如插入x,则 ...

  6. 使用kubeadm安装kubernetes v1.14.1

    使用kubeadm安装kubernetes v1.14.1 一.环境准备 操作系统:Centos 7.5 ​ ⼀ 一台或多台运⾏行行着下列列系统的机器器: ​ Ubuntu 16.04+ ​ Debi ...

  7. Java多态学习笔记

    面向对象三大特性:封装,继承和多态.其中,封装,继承都比较通俗易懂,唯有多态令我甚是头疼.经过仔细研究之后,终于搞懂了一点,特来做一个分享.独乐乐不如众乐乐. 何为多态?多态的本质是:一个程序中同名的 ...

  8. 5款好用的mysql客户端

    1. EMS SQL Manager for MySQL 是一款高性能MySQL数据库服务器系统的管理和开发工具.它支持从MySQL 3.23到6.0的任一版本,并支持最新版本的MySQL的特点,包括 ...

  9. codevs 1316 文化之旅 2012年NOIP全国联赛普及组

    时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题目描述 Description 有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一种文 ...

  10. 洛谷 P1918 保龄球

    题目描述 DL 算缘分算得很烦闷,所以常常到体育馆去打保龄球解闷.因为他保龄球已经打了几十年了,所以技术上不成问题,于是他就想玩点新花招. DL 的视力真的很不错,竟然能够数清楚在他前方十米左右每个位 ...