点支配、点覆盖、点独立

原创 2016年08月29日 20:21:34

【概念】

(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为顶点个数)。



在流程图中求支配点的一种快速算法

首先,对输入的有向图做DFS,形成生成树T,将节点按DFS序标号。 引理1.如果u 然后,对每个节点w≠r,计算其“半支配点”sdom(w):min{v|有一路径v=v0,v1,...,vk=...

树的最小支配集、最小点覆盖、最大独立集【模板】

最小支配集:指从所有顶点中取尽量少的点组成一个集合,使得剩下的所有点都与取出来的点有边相连。顶点个数最小的支配集被称为最小支配集。 最小点覆盖:指从所有顶点中取尽量少的点组成一个集合,使得集合中所有的...

支配集,点覆盖集,点独立集之间的联系

1.设无向图G(u,v)中无鼓励顶点,则G的极大点独立集都是G的极小支配集。逆命题不成立 理解:设V*为G的一个极大点独立集,那么对于那些不属于V*的点,他们肯定跟V*里的某个点相连(否则就不是极大了...

树的最小支配集&&最小点覆盖&&最大独立集模板

/* 覆盖i,要么是父节点覆盖,要么是自己,要么是孩子,所以三种状态(和上面的对应): 1、点i自己覆盖自己,i的所有孩子都覆盖,用dp[i][...

树的最小支配集,最小点覆盖与最大独立集

首先看一下三者的定义: 定义1 对于图G=(V,E)来说, 最小支配集 指的是从V中取尽量少的点组成一个集合,使得对于V中剩余的点都与取出来的点有边相连。也就是说,设V‘是图G的一个支配集,则对于图...
  • M_AXSSI
  • M_AXSSI
  • 2016年03月06日 15:15
  • 1166

贪心法求树的最小支配集,最小点覆盖,最大独立集

概念: 1、最小支配集:在图中用尽量少的点去覆盖所有的点(规则:当一个点被覆盖后,在图中与其相邻的点也将被覆盖); 2、最小点覆盖:在图中用尽量少的点去覆盖所有的边(规则:当一个点被覆盖后,在图中...

树的最小支配集,最小点覆盖与最大独立集 - smartyfh

首先看一下三者的定义: 定义1 对于图G=(V,E)来说, 最小支配集 指的是从V中取尽量少的点组成一个集合,使得对于V中剩余的点都与取出来的点有边相连。也就是说,设V‘是图G的一个支配集,则对...

树的最小支配集、最小点覆盖、最大独立集【模板】

最小支配集:指从所有顶点中取尽量少的点组成一个集合,使得剩下的所有点都与取出来的点有边相连。顶点个数最小的支配集被称为最小支配集。这里用贪心法来求。 1.以1号点深度优先搜索整棵树,求出每个点在...
  • judyge
  • judyge
  • 2015年05月13日 20:54
  • 374

图论小结(一)包括一些最短路,最小生成树,差分约束,欧拉回路,的经典题和变种题。强连通,双连通,割点割桥的应用。二分匹配,KM,支配集,独立集,还有2-SAT。

图论小结(一) 下面是对暑假集训的图论部分的一些总结和体会。 包括一些最短路,最小生成树,差分约束,欧拉回路,的经典题和变种题。强连通,双连通,割点割桥的应用。二分匹配,KM,支配集,独立集,还有2-...
  • ehi11
  • ehi11
  • 2012年08月27日 09:57
  • 6484

二分图的最大点权独立集和最小点权覆盖集

一个定理:二分图的最小点权覆盖集对应最大点权独立集          最小点权覆盖集的建图方法:                 1、增加源点 s,连接 s 到 x 集合中所有点,边权是相应点...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:点支配、点覆盖、点独立
举报原因:
原因补充:

(最多只允许输入30个字)