点支配、点覆盖、点独立
来源:互联网 发布:网络机顶盒性价比 编辑:程序博客网 时间:2024/04/27 10:37
【概念】
(1)点支配集,极小点支配集,最小点支配集,点支配数----γ0(G);
(2)点覆盖集,极小点覆盖集,最小点覆盖集,点覆盖数----α0(G);
(3)点独立集,极大点独立集,最大点独立集,点独立数----β0(G);
(4)边覆盖集,极小边覆盖集,最小边覆盖集,边覆盖数----α1(G);
(5)边独立集,及答辩独立集,最大边独立集,边独立数----β1(G);
对于无向图来说,且没有孤立顶点:
α0(G)+β0(G) = n;
α1(G)+β1(G) = n;
对于二部图来说,(无向二部图G有n个顶点,且没有孤立顶点):
α0(G) = β1(G) ;
β0(G) = n - β1(G);
说明:如果二部图有m个孤立顶点,则β0(G) 和n中分别扣除m个孤立顶点后满足该式,即:β0(G) -m = n-m-β1(G)。这样原式:β0(G) = n - β1(G),仍然成立。
----------------------------------------------------------------------------------------------------------------------------
【支配与支配集】:
设无向图为G(V,E),顶点集合V*属于V,若对于任意v∈(V-V*),存在一个u∈V*,使得(u,v)∈E,则称u支配v,并称V*为G的一个点支配集。
通俗的讲,V-V*中的每个顶点都是V*中某个顶点的邻接顶点,或者说V中的顶点要么是V*集合中的元素,要么与V*中的一个顶点相邻。
极小支配集:若支配集V*的任何真子集都不是支配集,则称V*是极小支配集。
最小支配集:顶点数最少的支配集称为最小支配集。
点支配数:最小支配集中的顶点数称为点支配数。
点支配集的性质
性质1:若G中无孤立顶点,则存在一个支配集V*,使得G中除V*外的所有顶点也组成一个支配集。
性质2:若G中无孤立顶点,V*为极小支配集,则G中除V*外的所有顶点也组成一个支配集。
POJ 3659
基本算法:
以最小支配集为例,首先选择一点为根,按照深度优先遍历得到遍历序列,按照所得序列的反向序列的顺序进行贪心,对于一个既不属于支配集也不与支配集中的点相连的点来说,如果他的父节点不属于支配集,将其父节点加入支配集。
#include <iostream>#include <algorithm>#include <string.h>#include <stdio.h>using namespace std;const int N = 1e5+10;struct Edge{ int v,next;}G[N];int fa[N];int vis[N];int pos[N],head[N],top;int now,n;int s[N];int set[N];void init(){ now = 0,top = 0; memset(vis,0,sizeof(vis)); memset(head,-1,sizeof(head)); memset(s,0,sizeof(s)); memset(set,0,sizeof(set));}void DFS(int u){ pos[now++] = u; for(int i = head[u]; ~i; i=G[i].next){ int v = G[i].v; if(!vis[v]){ vis[v] = 1; fa[v] = u; DFS(v); } }}void add(int u,int v){ G[top] = {v,head[u]}; head[u] = top++;}int MDS(){ int ans = 0; for(int i = now-1; i >= 0; --i){ int t = pos[i]; if(!s[t]){ if(!set[fa[t]]){ set[fa[t]] = 1; ans++; } s[t] = 1; s[fa[t]] = 1; s[fa[fa[t]]] = 1; } } return ans;}int main(){ int u,v; while(~scanf("%d",&n)){ init(); for(int i = 0; i < n-1; ++i){ scanf("%d%d",&u,&v); add(u,v),add(v,u); } DFS(1); int ans = MDS(); cout<<ans<<endl; } return 0;}
【点覆盖】
点覆盖集V*,就是G中所有的边至少有一个顶点属于V*。
极小点覆盖:若点覆盖V*的任何真子集都不是点覆盖,则称V*是极小点覆盖。
最小点覆盖:顶点个数最少的点覆盖称为最小点覆盖。
点覆盖数:最小点覆盖的顶点数称为点覆盖数。
求点覆盖数。
int MPC(){ int s[N] = {0}; int set[N] = {0}; int ans = 0; for(int i=now-1;i>=0;i--) { int t = pos[i]; if(!s[t] && !s[fa[t]]) { set[fa[t]] = 1; ans++; s[t] = 1; s[fa[t]] = 1; } } return ans;}
【点独立】
点独立集:设无向图为G(V,E),顶点集合V*属于V,若V*中任意两个顶点都均不相邻,则称V*为G的点独立集。
极大点独立集:若在V*中加入任何顶点都不再是独立集,则称V*为极大点独立集。
最大点独立集:顶点数最多的点独立集称为最大点独立集。
点独立数:最大点独立集的顶点数称为点独立数。
点独立数int MIS(){ int s[N] = {0}; int set[N] = {0}; int ans = 0; for(int i=now-1;i>=0;i--) { int t = pos[i]; if(!s[t]) { set[t] = 1; ans++; s[t] = 1; s[fa[t]] = 1; } } return ans;}
【点支配集、点覆盖集、点独立集之间的联系】
定理 1 设无向图G(V,E)中无独立顶点,则G的极大点独立集都是G的极小支配集。逆命题不成立(即极小支配集未必是极大独立集).
定理 2 一个独立集是极大独立集,当且仅当它是一个支配集。
定理 3 设无向图G(V,E)中无独立顶点,则V*是G的极小(最小)点覆盖集,当且仅当V-V*是G的极大(最大)点独立集,从而有:点覆盖+点独立=n(n为顶点个数)。
- 点支配、点覆盖、点独立
- 最小支配集、最小覆盖点、最大独立集
- 支配集,点覆盖集,点独立集之间的联系
- 树的最小支配集&&最小点覆盖&&最大独立集模板
- 树的最小支配集、最小点覆盖、最大独立集【模板】
- 树的最小支配集、最小点覆盖、最大独立集【模板】
- 树形dp 树的最小支配集,最小点覆盖与最大独立集
- 树的最小支配集,最小点覆盖与最大独立集 - smartyfh
- 树的最小支配集,最小点覆盖与最大独立集
- 贪心法求树的最小支配集,最小点覆盖,最大独立集
- 贪心法求树的最小支配集,最小点覆盖,最大独立集
- 树的最小支配集,最小点覆盖,最大独立集两种算法
- 【专题】树的最小支配集 最小点覆盖 最大独立集
- 树的最小支配集poj3659、最小点覆盖、最大独立集
- 点覆盖集和点独立集
- 最小路径覆盖,最小点覆盖,最大独立点集
- 最小路径覆盖,最小点覆盖,最大独立点集
- 点支配集
- tcp连接flags详解
- ObjectC快速入门教程(2)---字符串
- Camera in ROS and VISCA
- rabbitmq——prefetch count
- C/C++ 用C语言实现strstr函数
- 点支配、点覆盖、点独立
- M102: MongoDB for DBAs - Chapter 4: Replication
- poj3723(最大生成树)
- Java 基础与 面向对象
- POJ 2697 - A Board Game
- 关于fgets函数
- Linux系统SPI驱动学习笔记(一)
- C语言:全局变量在多个c文件中公用的方法
- USB设备开发---- 基于libusb的无驱设计