二分图匹配(匈牙利算法)板子

二分图匹配(匈牙利算法)

二分图

如果图中点可以被分为两组,并且使得所有边都跨越组的边界,则这就是一个二分图

原理

线性安排,不管是不是最优解,先安排着,如果后续无法匹配了再递归调整前面已经匹配好了的,最终肯定是最大匹配。匈牙利算法其实就是一个利用递归先假设匹配再不断反悔重新匹配的过程,很好理解。

实现

Hungarian(u)
	for each (u, v) in E                       // 枚举每一条边
        if(!vis[v])		//如果在之前已经试过了
			vis[v]=1		//标记
			if(!match[v] or Hungarian(match[v]))	//如果v点未被匹配或者匹配v的那个点可以有其他选择
				match[v]=u		//那么成功匹配,更新匹配
				return true
	return false		//匹配失败

注意每次开始匹配新的一个点时,需要初始化一下

for(...){
    memset(vis, 0, sizeof(vis));
    if(Hungarian(i))
        ...
}

本文采用 知识共享 署名-非商业性使用-相同方式共享 3.0 中国大陆 许可协议进行许可。欢迎转载,请注明出处: 转载自:Santiego的博客

原文地址:https://www.cnblogs.com/santiego/p/9564761.html