二分图----最大匹配,最小点覆盖,最大点独立集

一.二分图

二分图又称作二部图,是图论中的一种特殊模型。 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图。

当且仅当无向图G的每一个回路的次数均是偶数时,G才是一个二分图。如果无回路,相当于任一回路的次数为0,故也视为二分图。—— 故二分图判定用染色法。

二.二分图匹配

给定一个二分图G,在G的一个子图M中,M的边集{E}中的任意两条边都不依附于同一个顶点,则称M是一个匹配。
选择边数最大的子图称为图的最大匹配问题(maximal matching problem)
如果一个匹配中,图中的每个顶点都和图中某条边相关联,则称此匹配为完全匹配,也称作完备匹配。

三.匈牙利算法——用增广路求最大匹配(称作匈牙利算法,匈牙利数学家Edmonds于1965年提出)

先介绍一个概念:增广路径
如果从x部的一个未匹配的点出发,经过未匹配的边,再经过匹配过的边,再经过未匹配的边,以此类推,知道抵达y部的一个未匹配的点。

其有三条性质:
1.增广路径长度为奇数,且未匹配的边比已匹配的边多一条
2.将增广路取反,得到一条(匹配数+1)的路径
3.有且仅有当不再存在增广路径时,匹配数达到最大。

代码:

bool dfs(int u)
{
    vis[u]=true;
    for(node *p=adj[u];p;p=p->next){
        int v=p->v;
        if(!vis[v]){
            vis[v]=true;
            if(cy[v]==-1||dfs(cy[v])){
                cx[u]=v,cy[v]=u;
                return true;
            }
        }
    }
    return false;
}
void maxmatch()
{
    memset(cx,-1,sizeof cx);
    memset(cy,-1,sizeof cy);
    match=0;
    for(int i=1;i<=cnt1;i++)
        if(cx[i]==-1){
            memset(vis,0,sizeof vis);
            if(dfs(i)) match++;
        }
}

四.最小点覆盖

最小点覆盖=最大匹配
会证明了来更新。。。

五.最大点独立集

对于任意图中,有最大点独立集与最小点覆盖集互成补集。

转载于:https://www.cnblogs.com/katarinayuan/p/6572872.html

你可能感兴趣的:(二分图----最大匹配,最小点覆盖,最大点独立集)