树的最小支配集,最小点覆盖,最大独立集两种算法
2014-06-08 19:09
337 查看
1.基本概念
对图G=<V,E>,
最小支配集:从V中取尽量少的点组成一个集合,使得V中剩余的点都与取出来的点有边相连
最小点覆盖:从V中取尽量少的点组成一个集合,使得E中所有边都与取出来的点相连
最大独立集:从V中取尽量多的点组成一个集合,使得这些点之间没有边相连
2.贪心法求树的最小支配集,最小点覆盖,最大独立集模板
基本算法:
以最小支配集为例,首先选择一点为根,按照深度优先遍历得到遍历序列,按照所得序列的反向序列的顺序进行贪心,对于一个既不属于支配集也不与支配集中的点相连的点来说,如果他的父节点不属于支配集,将其父节点加入支配集。
最大独立集MIS_DP
例题:POJ 3398 /article/5250105.html
对图G=<V,E>,
最小支配集:从V中取尽量少的点组成一个集合,使得V中剩余的点都与取出来的点有边相连
最小点覆盖:从V中取尽量少的点组成一个集合,使得E中所有边都与取出来的点相连
最大独立集:从V中取尽量多的点组成一个集合,使得这些点之间没有边相连
2.贪心法求树的最小支配集,最小点覆盖,最大独立集模板
基本算法:
以最小支配集为例,首先选择一点为根,按照深度优先遍历得到遍历序列,按照所得序列的反向序列的顺序进行贪心,对于一个既不属于支配集也不与支配集中的点相连的点来说,如果他的父节点不属于支配集,将其父节点加入支配集。
struct Edge { int v,next; }G[M]; int fa ; int vis ; int pos ,head ; int now; int n,m; void DFS(int u) { pos[now++] = u; for(int i=head[u];i!=-1;i=G[i].next) { int v = G[i].v; if(!vis[v]) { vis[v] = 1; fa[v] = u; DFS(v); } } }
void MIS_DP(int u,int fa) { dp[u][0] = 1; dp[u][1] = 0; for(int i=head[u];i!=-1;i=G[i].next) { int v = G[i].v; if(v == fa) continue; MIS_DP(v,u); dp[u][0] += dp[v][1]; dp[u][1] += max(dp[v][0],dp[v][1]); } }
最大独立集MIS_DP
例题:POJ 3398 /article/5250105.html
相关文章推荐
- 树的最小支配集,最小点覆盖,最大独立集两种算法
- 树的最小支配集,最小点覆盖,最大独立集两种算法
- 贪心法求树的最小支配集,最小点覆盖,最大独立集
- 树形DP 树的最小支配集,最小点覆盖与最大独立集
- 贪心法求树的最小支配集,最小点覆盖,最大独立集
- 树上最大独立集,最小支配集,最小覆盖子集(贪心做法)
- 贪心法求树的最小支配集,最小点覆盖,最大独立集
- 树形DP求树的最小支配集,最小点覆盖,最大独立集
- 树形DP求树的最小支配集,最小点覆盖,最大独立集
- 树的最小支配集、最小点覆盖、最大独立集【模板】
- 树的最小支配集&&最小点覆盖&&最大独立集模板
- 二分图系列•二分图判定•匈牙利算法二分图的最大匹配•二分图最小点覆盖及最大独立集
- 树的最小支配集poj3659、最小点覆盖、最大独立集
- 贪心法求树的最小支配集,最小点覆盖,最大独立集
- 贪心法求树的最小支配集,最小点覆盖,最大独立集
- 树的最小支配集,最小点覆盖与最大独立集
- 树形dp 树的最小支配集,最小点覆盖与最大独立集
- 树的最小支配集,最小点覆盖与最大独立集 - smartyfh
- 树的最小支配集,最小点覆盖与最大独立集
- 树的最小支配集、最小点覆盖、最大独立集【模板】