二分图----最大匹配,最小点覆盖,最大点独立集
一.二分图
二分图又称作二部图,是图论中的一种特殊模型。 设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++;
}
}
四.最小点覆盖
最小点覆盖=最大匹配
会证明了来更新。。。
五.最大点独立集
对于任意图中,有最大点独立集与最小点覆盖集互成补集。