【匈牙利算法】二分图最大匹配(模板)

【匈牙利算法】

这是一个在二分图中寻找最大匹配的算法。


基本思路:寻找增广路径,它是一种用增广路径求二分图最大匹配的算法,找不到增广路时,达到最大匹配。所谓的增广路径,就是从一个未匹配点出发,经过非匹配边,匹配边,非匹配边,如果能到达一个未匹配点,则这条交替路称为增广路径。对于增广路径,我们必定能重新调整匹配,使得我们的匹配边+1。


例子:现在假设有3个女生3个男生,每个人都可能对多个异性有好感,假设1号男生喜欢1,3号女生,2号男生喜欢1号,2号女生,3号男生喜欢2号、3号女生。现在我们跑一遍匈牙利算法。从1号男生起,1号女生跟他相连,并且没有被匹配,因此1号男生跟1号女生之间匹配。然后我们为2号男生匹配,他喜欢1号女生,然而1号女生已经匹配给1号男生了,那我们看一下1号男生是否有别的女生可以匹配,结果是有的,3号女生。(3号女生也已经匹配,)于是1号男生跟3号女生,2号男生跟1号女生匹配。这便是增广路的一个例子。最后3号男生跟2号女生匹配,整个算法完成。


下面是代码:


int e[51][51];//保存一个图
int vis[51];
int match[51];
int dfs(int u)
{
	for(int i=1;i<=n;i++)
	{
		if(vis[i]==0&&e[u][i]==1)//如果这个点访问过,并且他们之间有边相连
		{
			vis[i]=1;
			if(match[i]==0||dfs(match[i]))//这个点还没有被匹配或者他原来匹配的点可以去匹配另外的点,如果有,则存在增广路。这是一个递归过程 
			{
				match[i]=u; //标记i与u匹配 
				return 1;
			}
		}	
	}
	return 0;
}  

int main() {
	//省略读取数据操作 
	tot=0;
	for(int i=1;i<=n;i++)
	{
		memset(vis,0,sizeof(vis));	
		if(dfs(i))
			tot++;//如果当前点可以匹配,则最大匹配数+1 
	} 
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值