题目链接: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])

  1. //dp
  2. #include <algorithm>
  3. #include <iostream>
  4. #include <cstdlib>
  5. #include <cstring>
  6. #include <cstdio>
  7. #include <vector>
  8. #include <cmath>
  9. #include <ctime>
  10. #include <list>
  11. #include <set>
  12. #include <map>
  13. using namespace std;
  14. typedef long long LL;
  15. typedef pair <int, int> P;
  16. const int N = ;
  17. vector <int> G[N];
  18. int dp[N][];
  19.  
  20. void dfs(int u, int p) {
  21. dp[u][] = , dp[u][] = ;
  22. for(int i = ; i < G[u].size(); ++i) {
  23. int v = G[u][i];
  24. if(v == p)
  25. continue;
  26. dfs(v, u);
  27. dp[u][] += dp[v][];
  28. dp[u][] += min(dp[v][], dp[v][]);
  29. }
  30. }
  31.  
  32. int main()
  33. {
  34. int n;
  35. while(~scanf("%d", &n)) {
  36. int u, num, v;
  37. for(int i = ; i <= n; ++i) {
  38. scanf("%d:(%d)", &u, &num);
  39. while(num--) {
  40. scanf("%d", &v);
  41. G[u].push_back(v);
  42. G[v].push_back(u);
  43. }
  44. }
  45. dfs(, -);
  46. printf("%d\n", min(dp[][], dp[][]));
  47. for(int i = ; i < n; ++i)
  48. G[i].clear();
  49. }
  50. return ;
  51. }
  52. /*
  53. 13
  54. 0:(3) 1 2 3
  55. 1:(0)
  56. 2:(2) 4 5
  57. 3:(2) 6 7
  58. 4:(0)
  59. 5:(0)
  60. 6:(2) 8 9
  61. 7:(3) 10 11 12
  62. 8:(0)
  63. 9:(0)
  64. 10:(0)
  65. 11:(0)
  66. 12:(0)
  67. */

边完全覆盖,也就是最小点覆盖所有边。

二分图中最大匹配=最小点覆盖

  1. //dp
  2. #include <algorithm>
  3. #include <iostream>
  4. #include <cstdlib>
  5. #include <cstring>
  6. #include <cstdio>
  7. #include <vector>
  8. #include <cmath>
  9. #include <ctime>
  10. #include <list>
  11. #include <set>
  12. #include <map>
  13. using namespace std;
  14. typedef long long LL;
  15. typedef pair <int, int> P;
  16. const int N = ;
  17. vector <int> G[N];
  18. int dp[N][];
  19.  
  20. void dfs(int u, int p) {
  21. dp[u][] = , dp[u][] = ;
  22. for(int i = ; i < G[u].size(); ++i) {
  23. int v = G[u][i];
  24. if(v == p)
  25. continue;
  26. dfs(v, u);
  27. dp[u][] += dp[v][];
  28. dp[u][] += min(dp[v][], dp[v][]);
  29. }
  30. }
  31.  
  32. int main()
  33. {
  34. int n;
  35. while(~scanf("%d", &n)) {
  36. int u, num, v;
  37. for(int i = ; i <= n; ++i) {
  38. scanf("%d:(%d)", &u, &num);
  39. while(num--) {
  40. scanf("%d", &v);
  41. G[u].push_back(v);
  42. G[v].push_back(u);
  43. }
  44. }
  45. dfs(, -);
  46. printf("%d\n", min(dp[][], dp[][]));
  47. for(int i = ; i < n; ++i)
  48. G[i].clear();
  49. }
  50. return ;
  51. }
  52. /*
  53. 13
  54. 0:(3) 1 2 3
  55. 1:(0)
  56. 2:(2) 4 5
  57. 3:(2) 6 7
  58. 4:(0)
  59. 5:(0)
  60. 6:(2) 8 9
  61. 7:(3) 10 11 12
  62. 8:(0)
  63. 9:(0)
  64. 10:(0)
  65. 11:(0)
  66. 12:(0)
  67. */

POJ1463 Strategic game (最小点覆盖 or 树dp)的更多相关文章

  1. HDU1054 Strategic Game —— 最小点覆盖 or 树形DP

    题目链接:https://vjudge.net/problem/HDU-1054 Strategic Game Time Limit: 20000/10000 MS (Java/Others)     ...

  2. LA 2038 Strategic game(最小点覆盖,树形dp,二分匹配)

    题意即求一个最小顶点覆盖. 对于没有孤立点的图G=(V,E),最大独立集+最小顶点覆盖= V.(往最大独立集加点) 问题可以变成求树上的最大独立集合. 每个结点的选择和其父节点选不选有关, dp(u, ...

  3. HDU 1054 Strategic Game (最小点覆盖)【二分图匹配】

    <题目链接> 题目大意:鲍勃喜欢玩电脑游戏,特别是战略游戏,但有时他无法找到解决方案,速度不够快,那么他很伤心.现在,他有以下的问题.他必须捍卫一个中世纪的城市,形成了树的道路.他把战士的 ...

  4. HDU 1054 Strategic Game 最小点覆盖

     最小点覆盖概念:选取最小的点数覆盖二分图中的所有边. 最小点覆盖 = 最大匹配数. 证明:首先假设我们求的最大匹配数为m,那么最小点覆盖必然 >= m,因为仅仅是这m条边就至少需要m个点.然后 ...

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

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

  6. POJ 3659 Cell phone Network (树的最小点覆盖, 树形DP)

    题意: 给定一棵树,每个点可以覆盖自己和相邻的点, 求最少要多少个点覆盖图 #include <cstdio> #include <cstring> #include < ...

  7. SPOJ 1479 +SPOJ 666 无向树最小点覆盖 ,第二题要方案数,树形dp

    题意:求一颗无向树的最小点覆盖. 本来一看是最小点覆盖,直接一下敲了二分图求最小割,TLE. 树形DP,叫的这么玄乎,本来是线性DP是线上往前\后推,而树形DP就是在树上,由叶子结点状态向根状态推. ...

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

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

  9. 求树的最大独立集,最小点覆盖,最小支配集 贪心and树形dp

    目录 求树的最大独立集,最小点覆盖,最小支配集 三个定义 贪心解法 树形DP解法 (有任何问题欢迎留言或私聊&&欢迎交流讨论哦 求树的最大独立集,最小点覆盖,最小支配集 三个定义 最大 ...

随机推荐

  1. [转] 解析Qt资源文件使用

    解析Qt资源文件使用 转自:http://mobile.51cto.com/symbian-270121.htm 本文详细的介绍了Qt文件的使用,和大部分GUI框架设计工具一样,Qt也引入了资源文件系 ...

  2. gcc与g++

    gcc和g++都是GNU(组织)的一个编译器. 误区一:gcc只能编译c代码,g++只能编译c++代码两者都可以,但是请注意:1.后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序:后缀为 ...

  3. impersonate a user

    // This sample demonstrates the use of the WindowsIdentity class to impersonate a user. // IMPORTANT ...

  4. jQuery.validate API

  5. ubuntu下安装Matlab

    (注:本文部分内容转自互联网) 一. 安装程序Step 1:下载matlab的安装文件至主目录下,讲matlab文件重命名为Mathworks.Matlab.R2012a.Unix.isoStep 2 ...

  6. JS一般般的网页重构可以使用Node.js做些什么(转)

    一.非计算机背景前端如何快速了解Node.js? 做前端的应该都听过Node.js,偏开发背景的童鞋应该都玩过. 对于一些没有计算机背景的,工作内容以静态页面呈现为主的前端,可能并未把玩过Node.j ...

  7. 自己的一个LESS工具函数库

    自己大概在一年前开始使用LESS编写样式,现在感觉不用LESS都不会写样式了.现在写静态页面完全离不开LESS与Zen Coding,我可以不用什么IDE,但这两个工具却必须要,当然也强烈推荐看到这篇 ...

  8. 【Android】Handler使用入门

    本讲内容:Handler使用入门 当用户点击一个按钮时如果执行的是一个常耗时操作的话,处理不好会导致系统假死,用户体验很差,而Android则更进一步,如果任意一个Acitivity没有响应5秒钟以上 ...

  9. 44、自定义仿IOS对话框

    private Dialog myDialog = null; private void ExitLogin() { View view = LayoutInflater.from(MainActiv ...

  10. 【PHP】linux搭建PHP运行环境

    之前在windows下写了hello world,终归是不够用啊,因为开发环境是Linux,怎么办呢~~~学习学习再学习 写在前面的话:我从百度文库的一个文章里摘出来的,原文章名称<Linux下 ...