树形DP 树的最小支配集,最小点覆盖与最大独立集
最小支配集:
从V中选取尽量少的点组成一个集合,让V中剩余的点都与取出来的点有边相连。
(点)
最小点覆盖:
从V中选取尽量少的点组成一个集合V1,让所有边(u,v)中要么u属于V1,要么v属于V1
(边)
最大独立集:
从V中选取尽量多的点组成一个集合,让这些点中间没有边项链,也就是说对于任何一条边,u,v不能同时属于集合V1.
1.贪心算法
首先选取一个点为根节点,求出所有节点对应的DFS序列,按照所得序列反向进行贪心,这样保证对于每个点来说,当子树都被处理过之后才会处理该节点
int p[MAXN];
bool select[MAXN];
int newpos[MAXN];
int now, n, m;
//最小支配集
int greedy1()
{
bool s[MAXN] = { };
bool set[MAXN] = { };
int ans = ;
int i;
for (i = n - ; i >= ; i--)
{
int t = newpos[p[t]];
if (!s[t])
{
if (!set[p[t]])
{
set[p[t]] = true;
ans++;
}
s[t] = s[p[t]] = s[p[p[t]]] = true;
}
}
return ans;
}
//最小点覆盖
int greedy2()
{
bool s[MAXN] = { };
bool set[MAXN] = { };
int ans = ;
for (int i = n - ; i >= ; i--)//不可以检查根节点,p[root] = root
{
int t = newpos[i];
if (!s[t] && !s[p[t]])
{
set[p[t]] = true;
ans++;
s[t] = s[p[t]] = true;
}
}
}
//最大独立集
int greedy3()
{
int ans = ;
bool s[MAXN] = { };
bool set[MAXN] = { };
for (int i = ; i >= ; i--)
{
int t = newpos[i];
if (!s[t])
{
set[t] = true;
ans++;
s[t] = s[p[t]] = true;
}
}
return ans;
}
2.树形DP
1.dp[i][0]: 表示点i属于支配集,并且以点i为根的子树都被覆盖了的情况下支配集中包含点最少的个数
2.dp[i][1] i不属于支配集,而且以i为根的子树都被覆盖而且i被其中不少于一个子节点覆盖情况下支配集所包含最少点的个数
3.dp[i][2] i不属于支配集,而且i为根的子树都被覆盖而且I没有被子节点覆盖的情况下支配集报验最少点的个数
对于第一情况,对子节点无限制
dp[i][0] = 1 + 西格玛min(dp[u][0],dp[u][1],dp[u][2]) p[u] = t
对于第二红情况, 如果i没有子节点那么dp[i][1] = INF,子节点必须被覆盖,所以和状态dp[i][2]无关的!
dp[i][1] = 西格玛min(dp[u][0],dp[u][1]) + inc
如果选取了某一个dp[u][0] inc = 0;
else inc = min(dp[u][0] - dp[u][1])
选取的时候注意如果全部选的都是dp[u][1]那父节点没办法被覆盖啦!所以判断一下
对于第三种情况,i不属于支配集,i的子树都被覆盖,说明i和i的儿子都不是支配集的!
dp[i][2] = 西格玛dp[u][1]
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<sstream>
#include<algorithm>
#include<queue>
#include<deque>
#include<iomanip>
#include<vector>
#include<cmath>
#include<map>
#include<stack>
#include<set>
#include<functional>
#include<fstream>
#include<memory>
#include<list>
#include<string>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL; #define N 31
#define INF 1000000009
#define eps 0.00000001
#define sf(a) scanf("%d",&a)
const int MAXN = 1e5 + ; int dp[MAXN][];
int head[MAXN];
void DP(int u, int p)
{
dp[u][] = ;
dp[u][] = ;
bool s = false;
int sum = , inc = INF;
int k;
for (k = head[u]; k != -; k = E[k].next)
{
int to = E[k].to;
if (to == p)
continue;
DP(to, u);
dp[u][] += min(dp[to][], dp[to][], dp[to][]);
if (dp[to][] < dp[to][])
{
s = true;
sum += dp[to][];
}
else
{
sum += dp[to][];
inc = min(inc, dp[to][] - dp[to][]);
}
if (dp[to][] != INF&&dp[u][] != INF)
dp[u][] += dp[to][];
else
dp[u][] = INF;
}
if (inc == INF && !s)
dp[u][] = INF;
else
{
dp[u][] = sum;
if (!s) dp[u][] += inc;
}
}
对于最小点覆盖
dp[u][0] u点被覆盖
dp[u][1] u点没被覆盖
int dp[MAXN][];
int head[MAXN];
void DP(int u, int p)
{
dp[u][] = ;
dp[u][] = ;
int k, to;
for (k = head[u]; k != -; k = E[k].next)
{
to = E[k].to;
if (to == p)
continue;
DP(to, u);
dp[u][] += min(dp[to][], dp[to][]);
dp[u][] += dp[to][];
}
}
树形DP 树的最小支配集,最小点覆盖与最大独立集的更多相关文章
- 树形DP求树的最小支配集,最小点覆盖,最大独立集
一:最小支配集 考虑最小支配集,每个点有两种状态,即属于支配集合或者不属于支配集合,其中不属于支配集合时此点还需要被覆盖,被覆盖也有两种状态,即被子节点覆盖或者被父节点覆盖.总结起来就是三种状态,现对 ...
- 求树的最大独立集,最小点覆盖,最小支配集 贪心and树形dp
目录 求树的最大独立集,最小点覆盖,最小支配集 三个定义 贪心解法 树形DP解法 (有任何问题欢迎留言或私聊&&欢迎交流讨论哦 求树的最大独立集,最小点覆盖,最小支配集 三个定义 最大 ...
- POJ3659 Cell Phone Network(树上最小支配集:树型DP)
题目求一棵树的最小支配数. 支配集,即把图的点分成两个集合,所有非支配集内的点都和支配集内的某一点相邻. 听说即使是二分图,最小支配集的求解也是还没多项式算法的.而树上求最小支配集树型DP就OK了. ...
- 树形dp(最小支配集)
http://poj.org/problem?id=3659 #include<iostream> #include<cstring> #include<algorith ...
- POJ 3659 Cell Phone Network / HUST 1036 Cell Phone Network(最小支配集,树型动态规划,贪心)-动态规划做法
POJ 3659 Cell Phone Network / HUST 1036 Cell Phone Network(最小支配集,树型动态规划,贪心) Description Farmer John ...
- POJ 3398 Perfect Service(树型动态规划,最小支配集)
POJ 3398 Perfect Service(树型动态规划,最小支配集) Description A network is composed of N computers connected by ...
- POJ 3659 Cell Phone Network(树的最小支配集)(贪心)
Cell Phone Network Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6781 Accepted: 242 ...
- 树的问题小结(最小生成树、次小生成树、最小树形图、LCA、最小支配集、最小点覆盖、最大独立集)
树的定义:连通无回路的无向图是一棵树. 有关树的问题: 1.最小生成树. 2.次小生成树. 3.有向图的最小树形图. 4.LCA(树上两点的最近公共祖先). 5.树的最小支配集.最小点覆盖.最大独立集 ...
- POJ 3398 Perfect Service --最小支配集
题目链接:http://poj.org/problem?id=3398 这题可以用两种上述讲的两种算法解:http://www.cnblogs.com/whatbeg/p/3776612.html 第 ...
随机推荐
- Asp.Net识别手机访问
在VS创建WEB应用程序时会有一个微软开发的典型web应用程序 在根目录有个用户控件用来实现切换手机和电脑 其中有个微软开发的类和方法用来专门判断移动设备和桌面设备 在Microsoft.AspNet ...
- AJPFX关于throw、throws关键字的解析
throw.throws关键字 throw关键字: 是用于方法体内部,用来抛出一个Throwable类型的异常.如果抛出了检查异常, 则还应该在方法头部声明方法可能抛出的异常类型.该方法的调用者也必须 ...
- Actionscript,AS3,MXML,Flex,Flex Builder,Flash Builder,Flash,AIR,Flash Player之关系
转自zrong's blog:http://zengrong.net/post/1295.htm ActionScript ActionScript通常简称为AS,它是Flash平台的语言.AS编写的 ...
- 2017广东工业大学程序设计竞赛决赛 H tmk买礼物
题意: Description 今天是校赛的日子,为了庆祝这么喜庆的日子,TMK打算买些礼物给女票LSH庆祝一下. TMK进入了雪梨超市,然后刚踏入的一瞬间,店主就对TMK说:“恭喜你成为了本店第21 ...
- vue 数组和对象的双向绑定不响应问题
对象和数组的数据类型是对象,对象是对象这个是毫无疑问的.数组可以把索引当成键名,把索引对应的元素当成该键名的键值. vue对象有些操作不能双向绑定的原因是vue未改变原对象,以及未给新增属性增加set ...
- Vue.js学习笔记--3.表单输入绑定
整理自官网教程 -- https://cn.vuejs.org/ 利用v-model可以实现表单元素的value与后台数据的双向绑定,具体用法如下: <!--文本--> <input ...
- 输入域名网站访问不了,ping与ftp都正常,这情况有可能域名被墙
被墙的风险 1.首先域名没有备案,而且服务器是国外的服务器, 2.域名解析到国外服务器 总结:以上两点有很大几率被墙的风险 被墙的解决方案: 1.换新域名并备案(不换新域名走第二步,域名一定要备案) ...
- 内存管理总结-autoreleasePool
转自其他 序言 无论是在MRC时期还是ARC时期,做过开发的程序员都接触过autoreleasepool.尽管接触过但本人对它还不是很了解.本文只是将自己的理解说出来.在内存管理的文章中提到了OC的内 ...
- mybatis 返回值
转载: 在使用ibatis插入数据进数据库的时候,会用到一些sequence的数据,有些情况下,在插入完成之后还需要将sequence的值返回,然后才能进行下一步的操作. 使用ibatis的 ...
- POI原生导入读取EXCEL
好久没用 最近项目有冲突 所以又用到了这个 谁知道以后还会不会用 先记下来吧 直接扔项目里 调方法就OK 了. 记录一下....不想再写类似这样的东西了 import org.apache.poi.h ...