二分图概念
二分图:
二分图又称作二部图,是图论中的一种特殊模型。 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图。
简单的说,一个图被分成了两部分,相同的部分没有边,那这个图就是二分图,二分图是特殊的图。
最大二分图匹配
最常用的是匈牙利算法,实际上是一种贪心的策略,尽量使每一个点存在匹配。
代码
const int maxn=1005;
int n,m,t;
int mch[maxn],vis[maxn];
vector<int >g[maxn];
bool dfs(int u,int tag)
{
if(vis[u]==tag)return false;//应该是避免绕圈
vis[u]=tag;
for(int i=0;i<g[u].size();i++)
{
int v=g[u][i];
if(mch[v]==0||dfs(mch[v],tag))//如果这个点未被匹配或者原先匹配的点可以找到别的匹配点
{
mch[v]=u;
return true;
}
}
return false;
}
main(void)
{
n=read();
m=read();
t=read();
while(t--)
{
int u=read();
int v=read();
g[u].push_back(v);
}
int ans=0;
for(int i=1;i<=n;i++)
{
if(dfs(i,i))
{
ans++;
}
}
cout<<ans;
}
二分图最优匹配与km算法
最小顶点覆盖
定义:假如选了一个点就相当于覆盖了以它为端点的所有边。最小顶点覆盖就是选择最少的点来覆盖所有的边。
定理:最小顶点覆盖等于二分图的最大匹配。
最大独立子集
定义:选出一些顶点使得这些顶点两两不相邻,则这些点构成的集合称为独立集。找出一个包含顶点数最多的独立集称为最大独立集。
定理:最大独立集 = 所有顶点数 - 最小顶点覆盖 = 所有顶点数 - 最大匹配