匈牙利算法---------->传送门
算法模板
bool find(int x)
{
for(int j=0;j<n;j++)
{
int v=g[x][j];//在保证x与j有关系的条件下,为j找到最合适的匹配
if( v && vis[j]==0)
{
vis[j]=1;
if(form[j]==-1 || find(form[j]))
{
form[j]=x;
return true;
}
}
}
return false;
}
主程序
int Hungary()
{
memset(form,0xff,sizeof(form));
int all=0;
for(int i=0;i<n;i++) //对每一个i进行匹配
{
memset(vis,0,sizeof(vis));
if(find(i))
all++;
}
return all;
}
性质
变种1:二分图的最小顶点覆盖
最小顶点覆盖要求用最少的点(X或Y中都行),让每条边都至少和其中一个点关联。
knoig定理:二分图的最小顶点覆盖数 = 二分图的最大匹配数(m)
变种2:DAG图的最小路径覆盖
用尽量少的不相交简单路径覆盖有向无环图(DAG)G的所有顶点,这就是DAG图的最小路
路径覆盖问题。
结论:DAG图的最小路径覆盖数 = 节点数(n)- 最大匹配数(m)
变种3:二分图的最大独立集
结论:二分图的最大独立集数 = 节点数(n)— 最大匹配数(m)
- 最大独立数=未匹配的节点+匹配数/2
- 未匹配的节点=顶点数-匹配数(设 n=匹配数/2,可以理解为去掉二分图某侧匹配好的n个节点,在另一侧对应的n个节点就没有相匹配的了)