二分图及相关算法

二分图概念

二分图定义:

二分图是图论中的一种特殊模型。设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(U,V),并且图中每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in U,j in V),则称图G是一个二分图
简而言之,就是顶点集V可分割为两个互不相交的子集,并且图中每条边依附的两个顶点都分属于这两个互不相交的子集,两个子集内的顶点不相邻
二分图及相关算法_第1张图片

二分图相关名词解释:

匹配:一个二分图存在一个子图,这个子图中的任意两条边都没有公共顶点,就将这个子图称为二分图的一个匹配
二分图及相关算法_第2张图片
最大匹配:一个图所有匹配中,所含匹配边数最多的匹配,称为这个图的最大匹配
二分图及相关算法_第3张图片
完全匹配:如果一个图的某个匹配中,所有的顶点都是匹配点,那么它就是一个完全匹配;显然,完全匹配一定是最大匹配;但并非每个图都存在完全匹配
二分图及相关算法_第4张图片

最大匹配推论的相关定义

顶点覆盖:
在顶点集合中,选取一部分顶点,这些顶点能够把所有的边都覆盖了。这些点就是顶点覆盖集

最小顶点覆盖:
在所有的顶点覆盖集中,顶点数最小的那个叫最小顶点集合。

独立集:
在所有的顶点中选取一些顶点,这些顶点两两之间没有连线,这些点就叫独立集

最大独立集:
在左右的独立集中,顶点数最多的那个集合

路径覆盖:
在图中找一些路径,这些路径覆盖图中所有的顶点,每个顶点都只与一条路径相关联。

最小路径覆盖:
在所有的路径覆盖中,路径个数最小的就是最小路径覆盖了。

最大匹配相关结论

1.最大匹配数 = 最小顶点覆盖
证明:首先要明确的一点是最小顶点覆盖一定不会小于最大匹配数。显而易见,最大匹配中的每一个匹配都是不相邻的一条边,如果最大匹配数为n,那么至少需要n个顶点来覆盖这n条边。

2.最小边覆盖 = 顶点数 - 最小顶点覆盖
证明:设顶点数为 n ,最大匹配为 a。因为要使得边最少,所以先选择最大匹配的边(一次可以覆盖两个点) ,剩下的每个点都需要一条边去覆盖,设剩下的为 b = n -2 * a 。而最小边覆盖此时等于 a + b =n - a,证完。

3.最大独立集 = 顶点数 - 最大匹配数
证明:顶点中去除最大匹配的点剩下的就是孤立的点,就是最大独立集

最大团 = 补图的最大独立集

最小边覆盖 = 二分图最大独立集 = |V| - 最小路径覆盖

最小路径覆盖 = |V| - 最大匹配数

最小顶点覆盖 = 最大匹配数

最小顶点覆盖 + 最大独立数 = |V|

最小割 = 最小点权覆盖集 = 点权和 - 最大点权独立集

二分图判断

bool check()
{
    memset(used,-1,sizeof(used));
    queue<int>Q;
    Q.push(1);
    used[1]=0;
    while(!Q.empty())
    {
        int now=Q.front();
        for(int i=1;i<=n;i++)    //遍历所有点
        {
            if(map[now][i]==0)    //邻接矩阵存图
                continue;
            int v=i;
            if(used[v]==-1)
            {
                used[v]=(used[now]+1)%2;
                Q.push(v);
            }
            else
            {
                if(used[v]==used[now])
                    return false;
            }
        }
        Q.pop();
    }
    return true;
}

二分图相关算法

1.匈牙利算法
2.KM算法
3.GS算法

你可能感兴趣的:(算法完全解析)