POJ1463 Strategic game (最小点覆盖 or 树dp)
题目链接:http://poj.org/problem?id=1463
给你一棵树形图,问最少多少个点覆盖所有的边。
可以用树形dp做,任选一点,自底向上回溯更新。
dp[i][0] 表示不选i点 覆盖子树所有边的最少点个数,那选i点的话,那么i的邻接节点都是必选的,所以dp[i][0] += dp[i.son][1]
dp[i][1] 表示选i点 覆盖子树所有边的最少点个数,那么i的邻接点可选可不选(而不是一定不选,看注释样例就知道了),所以dp[i][0] += min(dp[i.son][1], dp[i.son][0])
- //dp
- #include <algorithm>
- #include <iostream>
- #include <cstdlib>
- #include <cstring>
- #include <cstdio>
- #include <vector>
- #include <cmath>
- #include <ctime>
- #include <list>
- #include <set>
- #include <map>
- using namespace std;
- typedef long long LL;
- typedef pair <int, int> P;
- const int N = ;
- vector <int> G[N];
- int dp[N][];
- void dfs(int u, int p) {
- dp[u][] = , dp[u][] = ;
- for(int i = ; i < G[u].size(); ++i) {
- int v = G[u][i];
- if(v == p)
- continue;
- dfs(v, u);
- dp[u][] += dp[v][];
- dp[u][] += min(dp[v][], dp[v][]);
- }
- }
- int main()
- {
- int n;
- while(~scanf("%d", &n)) {
- int u, num, v;
- for(int i = ; i <= n; ++i) {
- scanf("%d:(%d)", &u, &num);
- while(num--) {
- scanf("%d", &v);
- G[u].push_back(v);
- G[v].push_back(u);
- }
- }
- dfs(, -);
- printf("%d\n", min(dp[][], dp[][]));
- for(int i = ; i < n; ++i)
- G[i].clear();
- }
- return ;
- }
- /*
- 13
- 0:(3) 1 2 3
- 1:(0)
- 2:(2) 4 5
- 3:(2) 6 7
- 4:(0)
- 5:(0)
- 6:(2) 8 9
- 7:(3) 10 11 12
- 8:(0)
- 9:(0)
- 10:(0)
- 11:(0)
- 12:(0)
- */
边完全覆盖,也就是最小点覆盖所有边。
二分图中最大匹配=最小点覆盖
- //dp
- #include <algorithm>
- #include <iostream>
- #include <cstdlib>
- #include <cstring>
- #include <cstdio>
- #include <vector>
- #include <cmath>
- #include <ctime>
- #include <list>
- #include <set>
- #include <map>
- using namespace std;
- typedef long long LL;
- typedef pair <int, int> P;
- const int N = ;
- vector <int> G[N];
- int dp[N][];
- void dfs(int u, int p) {
- dp[u][] = , dp[u][] = ;
- for(int i = ; i < G[u].size(); ++i) {
- int v = G[u][i];
- if(v == p)
- continue;
- dfs(v, u);
- dp[u][] += dp[v][];
- dp[u][] += min(dp[v][], dp[v][]);
- }
- }
- int main()
- {
- int n;
- while(~scanf("%d", &n)) {
- int u, num, v;
- for(int i = ; i <= n; ++i) {
- scanf("%d:(%d)", &u, &num);
- while(num--) {
- scanf("%d", &v);
- G[u].push_back(v);
- G[v].push_back(u);
- }
- }
- dfs(, -);
- printf("%d\n", min(dp[][], dp[][]));
- for(int i = ; i < n; ++i)
- G[i].clear();
- }
- return ;
- }
- /*
- 13
- 0:(3) 1 2 3
- 1:(0)
- 2:(2) 4 5
- 3:(2) 6 7
- 4:(0)
- 5:(0)
- 6:(2) 8 9
- 7:(3) 10 11 12
- 8:(0)
- 9:(0)
- 10:(0)
- 11:(0)
- 12:(0)
- */
POJ1463 Strategic game (最小点覆盖 or 树dp)的更多相关文章
- HDU1054 Strategic Game —— 最小点覆盖 or 树形DP
题目链接:https://vjudge.net/problem/HDU-1054 Strategic Game Time Limit: 20000/10000 MS (Java/Others) ...
- LA 2038 Strategic game(最小点覆盖,树形dp,二分匹配)
题意即求一个最小顶点覆盖. 对于没有孤立点的图G=(V,E),最大独立集+最小顶点覆盖= V.(往最大独立集加点) 问题可以变成求树上的最大独立集合. 每个结点的选择和其父节点选不选有关, dp(u, ...
- HDU 1054 Strategic Game (最小点覆盖)【二分图匹配】
<题目链接> 题目大意:鲍勃喜欢玩电脑游戏,特别是战略游戏,但有时他无法找到解决方案,速度不够快,那么他很伤心.现在,他有以下的问题.他必须捍卫一个中世纪的城市,形成了树的道路.他把战士的 ...
- HDU 1054 Strategic Game 最小点覆盖
最小点覆盖概念:选取最小的点数覆盖二分图中的所有边. 最小点覆盖 = 最大匹配数. 证明:首先假设我们求的最大匹配数为m,那么最小点覆盖必然 >= m,因为仅仅是这m条边就至少需要m个点.然后 ...
- HDU 1054 Strategic Game(最小点覆盖+树形dp)
题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=106048#problem/B 题意:给出一些点相连,找出最小的点数覆盖所有的 ...
- POJ 3659 Cell phone Network (树的最小点覆盖, 树形DP)
题意: 给定一棵树,每个点可以覆盖自己和相邻的点, 求最少要多少个点覆盖图 #include <cstdio> #include <cstring> #include < ...
- SPOJ 1479 +SPOJ 666 无向树最小点覆盖 ,第二题要方案数,树形dp
题意:求一颗无向树的最小点覆盖. 本来一看是最小点覆盖,直接一下敲了二分图求最小割,TLE. 树形DP,叫的这么玄乎,本来是线性DP是线上往前\后推,而树形DP就是在树上,由叶子结点状态向根状态推. ...
- HDU - 1054 Strategic Game(二分图最小点覆盖/树形dp)
d.一颗树,选最少的点覆盖所有边 s. 1.可以转成二分图的最小点覆盖来做.不过转换后要把匹配数除以2,这个待细看. 2.也可以用树形dp c.匈牙利算法(邻接表,用vector实现): /* 用ST ...
- 求树的最大独立集,最小点覆盖,最小支配集 贪心and树形dp
目录 求树的最大独立集,最小点覆盖,最小支配集 三个定义 贪心解法 树形DP解法 (有任何问题欢迎留言或私聊&&欢迎交流讨论哦 求树的最大独立集,最小点覆盖,最小支配集 三个定义 最大 ...
随机推荐
- [转] 解析Qt资源文件使用
解析Qt资源文件使用 转自:http://mobile.51cto.com/symbian-270121.htm 本文详细的介绍了Qt文件的使用,和大部分GUI框架设计工具一样,Qt也引入了资源文件系 ...
- gcc与g++
gcc和g++都是GNU(组织)的一个编译器. 误区一:gcc只能编译c代码,g++只能编译c++代码两者都可以,但是请注意:1.后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序:后缀为 ...
- impersonate a user
// This sample demonstrates the use of the WindowsIdentity class to impersonate a user. // IMPORTANT ...
- jQuery.validate API
- ubuntu下安装Matlab
(注:本文部分内容转自互联网) 一. 安装程序Step 1:下载matlab的安装文件至主目录下,讲matlab文件重命名为Mathworks.Matlab.R2012a.Unix.isoStep 2 ...
- JS一般般的网页重构可以使用Node.js做些什么(转)
一.非计算机背景前端如何快速了解Node.js? 做前端的应该都听过Node.js,偏开发背景的童鞋应该都玩过. 对于一些没有计算机背景的,工作内容以静态页面呈现为主的前端,可能并未把玩过Node.j ...
- 自己的一个LESS工具函数库
自己大概在一年前开始使用LESS编写样式,现在感觉不用LESS都不会写样式了.现在写静态页面完全离不开LESS与Zen Coding,我可以不用什么IDE,但这两个工具却必须要,当然也强烈推荐看到这篇 ...
- 【Android】Handler使用入门
本讲内容:Handler使用入门 当用户点击一个按钮时如果执行的是一个常耗时操作的话,处理不好会导致系统假死,用户体验很差,而Android则更进一步,如果任意一个Acitivity没有响应5秒钟以上 ...
- 44、自定义仿IOS对话框
private Dialog myDialog = null; private void ExitLogin() { View view = LayoutInflater.from(MainActiv ...
- 【PHP】linux搭建PHP运行环境
之前在windows下写了hello world,终归是不够用啊,因为开发环境是Linux,怎么办呢~~~学习学习再学习 写在前面的话:我从百度文库的一个文章里摘出来的,原文章名称<Linux下 ...