您的位置:首页 > 其它

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

2017-08-18 21:03 204 查看

讲解

匈牙利算法,(俗称“找妹子算法”),是一种求二分图最大匹配的常用算法。

为什么叫“找妹子算法”呢?

这是因为它的实现原理很像在找妹子:

首先,我们把一堆点分成两边(这才是“二分”,不是真正的“二分”):



男女生两个点之间连一条线表示他们互相喜欢

现在我们要求尽量每个人都找到妹子的最大匹配。

我们首先看,Boy1(我们以后都这样称呼),首先看一下Girl5:“还是单身,不错不错,好了,就是她了!”

于是,Girl5就有男朋友Boy1了。(我们把它标红)



然后轮到Boy2了,当然首选Girl5,但是Girl5说:“我已经有男朋友了Boy1了,你如果要我,就把他踢掉吧。”

于是Boy2就把Boy1踢掉了,Boy1很伤心,就去找别的,但是发现没有看得上的了,所以就又回来把Boy2踢掉了。Boy2就不可能选Girl5了,我们把它表示绿:



Boy2只好找下一个,结果没有了,就很伤心,找不到女朋友了。

然后到Boy3了,他同样找到了Girl6做女朋友:



到Boy4了,他首先看中了Girl6,于是同样去把Boy3踢走,于是Boy3很爽快的让给了他,“看你这么可怜,让给你吧。”,于是又去找了Girl8.



最终Boy2和Girl7没有了对象,只好不匹配了。

原理就是这样。

总结:每次找可以与当前点匹配的点,如果它被别人选了,就让别人去找另一个,自己占有它,如果别人没了,就换一个(因为我们要最大匹配)。直到全部匹配完为止。

bool Matching(int x)
{
int i,xx,p;
for (i=1;i<=m;++i)
{
if (bz[i]==false)
{
bz[i]=true;
p=las[i];
las[i]=x;//las表示这个点的前驱。
if (p==0||Matching(p)) return true;
las[i]=p;
}
}
return false;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: