http://poj.org/problem?id=3659

  1. #include<iostream>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<cstdio>
  5. #include<vector>
  6. using namespace std;
  7. const int M=1e4+;
  8. const int inf=0x3f3f3f3f;
  9. vector<int>e[M];
  10. int dp[M][];
  11. void dfs(int u ,int f){
  12. dp[u][]=;
  13. int minn=inf;
  14. int flag=;
  15. for(int i=;i<e[u].size();i++){
  16. int v=e[u][i];
  17. if(v==f)
  18. continue;
  19. dfs(v,u);
  20. dp[u][]+=min(dp[v][],min(dp[v][],dp[v][]));
  21. dp[u][]+=min(dp[v][],dp[v][]);
  22. if(dp[v][]<=dp[v][]){
  23. flag=;
  24. dp[u][]+=dp[v][];
  25. }
  26. else{
  27. minn=min(minn,dp[v][]-dp[v][]);
  28. dp[u][]+=dp[v][];
  29. }
  30. }
  31. if(flag)
  32. dp[u][]+=minn;
  33. }
  34. int main(){
  35. int n;
  36. scanf("%d",&n);
  37. for(int i=;i<n;i++){
  38. int u,v;
  39. scanf("%d%d",&u,&v);
  40. e[u].push_back(v);
  41. e[v].push_back(u);
  42. }
  43. dfs(,-);
  44. printf("%d",min(dp[][],dp[][]));
  45. return ;
  46. }

解题:可以用动态规划,也可以用最小支配集。

一、现在先说用动态规划的思路:

根据题意知道每个节点有三种状态:

1、点i建塔,i的所有孩子都覆盖,用dp[i][0]表示;

2、点i不建塔,i和i的所有孩子都覆盖,用dp[i][1]表示;

3、点i不建塔,i不覆盖,i的所有孩子都覆盖,用dp[i][2]表示;

如果这样不好理解那么这样理解可能容易一点(参考别人的):覆盖i,要么是父节点覆盖,要么是自己,要么是孩子,所以三种状态(和上面的对应):

1、点i自己覆盖自己,i的所有孩子都覆盖,用dp[i][0]表示;

2、点i被自己的孩子覆盖,i和i的所有孩子都覆盖,用dp[i][1]表示;

3、点i被父节点覆盖,i的所有孩子都覆盖,用dp[i][2]表示;

那么动态转移方程就是(v是i的孩子):

dp[i][0]+=min(dp[v][0],dp[v][1],dp[v][2]);

dp[i][2]+=min(dp[v][0],dp[v][1]);

对于dp[i][1],要考虑全面,也就是说:必须要有一个孩子建塔,才能保证i被覆盖(Min=sum(min(dp[v][0]-dp[i][1])),也就是当所有孩子的dp[v][0]>dp[v][i]时,Min表示他们差值最小的那个差值)。

所以方程是dp[i][1]+=min(dp[v][0],dp[1])(至少存在一个孩子的dp[v][0]<=dp[v][1],否则要dp[i][1]+=Min);

原文:https://blog.csdn.net/jiang199235jiangjj/article/details/7878473

树形dp(最小支配集)的更多相关文章

  1. 树形DP 树的最小支配集,最小点覆盖与最大独立集

    最小支配集: 从V中选取尽量少的点组成一个集合,让V中剩余的点都与取出来的点有边相连. (点) 最小点覆盖: 从V中选取尽量少的点组成一个集合V1,让所有边(u,v)中要么u属于V1,要么v属于V1 ...

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

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

  3. 树形DP求树的最小支配集,最小点覆盖,最大独立集

    一:最小支配集 考虑最小支配集,每个点有两种状态,即属于支配集合或者不属于支配集合,其中不属于支配集合时此点还需要被覆盖,被覆盖也有两种状态,即被子节点覆盖或者被父节点覆盖.总结起来就是三种状态,现对 ...

  4. POJ3659 Cell Phone Network(树上最小支配集:树型DP)

    题目求一棵树的最小支配数. 支配集,即把图的点分成两个集合,所有非支配集内的点都和支配集内的某一点相邻. 听说即使是二分图,最小支配集的求解也是还没多项式算法的.而树上求最小支配集树型DP就OK了. ...

  5. POJ 3398 Perfect Service --最小支配集

    题目链接:http://poj.org/problem?id=3398 这题可以用两种上述讲的两种算法解:http://www.cnblogs.com/whatbeg/p/3776612.html 第 ...

  6. Cell Phone Networ (树形dp-最小支配集)

    目录 Cell Phone Networ (树形dp-最小支配集) 题意 思路 题解 Cell Phone Networ (树形dp-最小支配集) Farmer John has decided to ...

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

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

  8. 求解任意图的最小支配集(Minimun Dominating Set)

    给定一个无向图G =(V,E),其中V表示图中顶点集合,E表示边的集合.G的最小控制顶点集合为V的一个子集S∈V:假设集合R表示V排除集合S后剩余顶点集合,即R∩S=∅,R∪S=V:则最小控制顶点集合 ...

  9. POJ 3398 Perfect Service(树型动态规划,最小支配集)

    POJ 3398 Perfect Service(树型动态规划,最小支配集) Description A network is composed of N computers connected by ...

随机推荐

  1. 小白需要了解的Ajax和websocket的区别以及使用场景!

    在我们日常使用的互联网产品中,很多都是前后端数据的交互来完成的,说到数据交互就不得不提Ajax和websocket,它们可是数据交互的利器,那么它们分别是什么?websocket与Ajax轮询的区别又 ...

  2. 201703-2 学生排队 Java

    思路: 将需要移动的学生remove后再add 题目中说向前向后移动不会超过人数,也就是不会出现隔着的情况.所以不会越界. import java.util.ArrayList; import jav ...

  3. pycharm使用常见设置

    字体修改: file——setting——Editor——font(快捷键:ctrl+alt+s) 修改项目编译器:a,b方法二选一 a.ctrl+alt+s,调出设置窗口——选中想要换的版本即可,如 ...

  4. c++ 获取GMT 时间和字符串

    需要跨平台,所以可选的只有std 和 boost: boost 比较复杂了 #include <boost/date_time/local_time/local_time.hpp> std ...

  5. Servlet基本概念及其部署

    什么servlet? Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,主要功能在于交互式地浏览和修改数据,生成动 ...

  6. DRF-JWT

    DRF-JWT 一.JWT JWT全称: json web token, 作用:将原始的数据json加密成字符串,通过后台将加密的字符串给前台存储(token) 格式:三段式,头.载荷.签名 , 头和 ...

  7. 34. docker swarm Dockerstack 部署 wordpress

    1. 查看 docker compose    depoly 语法 官网地址 : https://docs.docker.com/compose/compose-file/#deploy ENDPOI ...

  8. NATAPP内网穿透软件使用指南

    1.请求官网路径没有账号的注册,有账号的直接登录 https://natapp.cn 2.下载不同环境所需的启动文件,另存为不同目录 https://natapp.cn/#download --> ...

  9. Python笔记_第一篇_面向过程_第一部分_9.Ubuntu基础操作

    第一部分   Ubuntu简介 Ubuntu(乌班图)是一个机遇Debian的以桌面应用为主的Linux操作系统,据说其名称来自非洲南部祖鲁语或科萨语的“Ubuntu”一词,意思是“人性”.“我的存在 ...

  10. Linux shell脚本 基础

    一.shell中三个引号的用法 1.单引号:所见即所得 例如:var=123 var2='${var}123' echo var2 var2结果为${var}123 2.双引号:输出引号中的内容,若存 ...