您的位置:首页 > 其它

二分图匈牙利算法模板

2016-05-31 20:13 253 查看
想看更多模板,请点击:http://blog.csdn.net/martinue/article/category/6268283

最大匹配数:最大匹配的匹配边的数目

最小点覆盖数:选取最少的点,使任意一条边至少有一个端点被选择

最大独立数:选取最多的点,使任意所选两点均不相连

最小路径覆盖数:对于一个 DAG(有向无环图),选取最少条路径,使得每个顶点属于且仅属于一条路径。路径长可以为0(即单个点)。

定理1:最大匹配数 = 最小点覆盖数(这是 Konig 定理)

定理2:最大匹配数 = 最大独立数

定理3:最小路径覆盖数 = 顶点数 - 最大匹配数

const int N=555;///两边的最大数量
bool tu

;
int from
;///记录右边的点如果配对好了它来自哪里
bool use
;///记录右边的点是否已经完成了配对
int n,m;///m,n分别表示两边的各自数量,n是左边,m是右边
bool dfs(int x)
{
for(int i=1;i<=m;i++)///m是右边,所以这里上界是m
if(!use[i]&&tu[x][i])
{
use[i]=1;
if(from[i]==-1||dfs(from[i]))
{
from[i]=x;
return 1;
}
}
return 0;
}
int hungary()
{
int tot=0;
memset(from,-1,sizeof(from));
for(int i=1;i<=n;i++)///n是左边,所以这里上界是n
{
memset(use,0,sizeof(use));
if(dfs(i))
tot++;
}
return tot;
}

也可以改写成vector版本的,方法比较灵活。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  acm 大二