树形dp(最小支配集)
http://poj.org/problem?id=3659
- #include<iostream>
- #include<cstring>
- #include<algorithm>
- #include<cstdio>
- #include<vector>
- using namespace std;
- const int M=1e4+;
- const int inf=0x3f3f3f3f;
- vector<int>e[M];
- int dp[M][];
- void dfs(int u ,int f){
- dp[u][]=;
- int minn=inf;
- int flag=;
- for(int i=;i<e[u].size();i++){
- int v=e[u][i];
- if(v==f)
- continue;
- dfs(v,u);
- dp[u][]+=min(dp[v][],min(dp[v][],dp[v][]));
- dp[u][]+=min(dp[v][],dp[v][]);
- if(dp[v][]<=dp[v][]){
- flag=;
- dp[u][]+=dp[v][];
- }
- else{
- minn=min(minn,dp[v][]-dp[v][]);
- dp[u][]+=dp[v][];
- }
- }
- if(flag)
- dp[u][]+=minn;
- }
- int main(){
- int n;
- scanf("%d",&n);
- for(int i=;i<n;i++){
- int u,v;
- scanf("%d%d",&u,&v);
- e[u].push_back(v);
- e[v].push_back(u);
- }
- dfs(,-);
- printf("%d",min(dp[][],dp[][]));
- return ;
- }
解题:可以用动态规划,也可以用最小支配集。
一、现在先说用动态规划的思路:
根据题意知道每个节点有三种状态:
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(最小支配集)的更多相关文章
- 树形DP 树的最小支配集,最小点覆盖与最大独立集
最小支配集: 从V中选取尽量少的点组成一个集合,让V中剩余的点都与取出来的点有边相连. (点) 最小点覆盖: 从V中选取尽量少的点组成一个集合V1,让所有边(u,v)中要么u属于V1,要么v属于V1 ...
- 求树的最大独立集,最小点覆盖,最小支配集 贪心and树形dp
目录 求树的最大独立集,最小点覆盖,最小支配集 三个定义 贪心解法 树形DP解法 (有任何问题欢迎留言或私聊&&欢迎交流讨论哦 求树的最大独立集,最小点覆盖,最小支配集 三个定义 最大 ...
- 树形DP求树的最小支配集,最小点覆盖,最大独立集
一:最小支配集 考虑最小支配集,每个点有两种状态,即属于支配集合或者不属于支配集合,其中不属于支配集合时此点还需要被覆盖,被覆盖也有两种状态,即被子节点覆盖或者被父节点覆盖.总结起来就是三种状态,现对 ...
- POJ3659 Cell Phone Network(树上最小支配集:树型DP)
题目求一棵树的最小支配数. 支配集,即把图的点分成两个集合,所有非支配集内的点都和支配集内的某一点相邻. 听说即使是二分图,最小支配集的求解也是还没多项式算法的.而树上求最小支配集树型DP就OK了. ...
- POJ 3398 Perfect Service --最小支配集
题目链接:http://poj.org/problem?id=3398 这题可以用两种上述讲的两种算法解:http://www.cnblogs.com/whatbeg/p/3776612.html 第 ...
- Cell Phone Networ (树形dp-最小支配集)
目录 Cell Phone Networ (树形dp-最小支配集) 题意 思路 题解 Cell Phone Networ (树形dp-最小支配集) Farmer John has decided to ...
- POJ 3659 Cell Phone Network / HUST 1036 Cell Phone Network(最小支配集,树型动态规划,贪心)-动态规划做法
POJ 3659 Cell Phone Network / HUST 1036 Cell Phone Network(最小支配集,树型动态规划,贪心) Description Farmer John ...
- 求解任意图的最小支配集(Minimun Dominating Set)
给定一个无向图G =(V,E),其中V表示图中顶点集合,E表示边的集合.G的最小控制顶点集合为V的一个子集S∈V:假设集合R表示V排除集合S后剩余顶点集合,即R∩S=∅,R∪S=V:则最小控制顶点集合 ...
- POJ 3398 Perfect Service(树型动态规划,最小支配集)
POJ 3398 Perfect Service(树型动态规划,最小支配集) Description A network is composed of N computers connected by ...
随机推荐
- 小白需要了解的Ajax和websocket的区别以及使用场景!
在我们日常使用的互联网产品中,很多都是前后端数据的交互来完成的,说到数据交互就不得不提Ajax和websocket,它们可是数据交互的利器,那么它们分别是什么?websocket与Ajax轮询的区别又 ...
- 201703-2 学生排队 Java
思路: 将需要移动的学生remove后再add 题目中说向前向后移动不会超过人数,也就是不会出现隔着的情况.所以不会越界. import java.util.ArrayList; import jav ...
- pycharm使用常见设置
字体修改: file——setting——Editor——font(快捷键:ctrl+alt+s) 修改项目编译器:a,b方法二选一 a.ctrl+alt+s,调出设置窗口——选中想要换的版本即可,如 ...
- c++ 获取GMT 时间和字符串
需要跨平台,所以可选的只有std 和 boost: boost 比较复杂了 #include <boost/date_time/local_time/local_time.hpp> std ...
- Servlet基本概念及其部署
什么servlet? Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,主要功能在于交互式地浏览和修改数据,生成动 ...
- DRF-JWT
DRF-JWT 一.JWT JWT全称: json web token, 作用:将原始的数据json加密成字符串,通过后台将加密的字符串给前台存储(token) 格式:三段式,头.载荷.签名 , 头和 ...
- 34. docker swarm Dockerstack 部署 wordpress
1. 查看 docker compose depoly 语法 官网地址 : https://docs.docker.com/compose/compose-file/#deploy ENDPOI ...
- NATAPP内网穿透软件使用指南
1.请求官网路径没有账号的注册,有账号的直接登录 https://natapp.cn 2.下载不同环境所需的启动文件,另存为不同目录 https://natapp.cn/#download --> ...
- Python笔记_第一篇_面向过程_第一部分_9.Ubuntu基础操作
第一部分 Ubuntu简介 Ubuntu(乌班图)是一个机遇Debian的以桌面应用为主的Linux操作系统,据说其名称来自非洲南部祖鲁语或科萨语的“Ubuntu”一词,意思是“人性”.“我的存在 ...
- Linux shell脚本 基础
一.shell中三个引号的用法 1.单引号:所见即所得 例如:var=123 var2='${var}123' echo var2 var2结果为${var}123 2.双引号:输出引号中的内容,若存 ...