淺談二分圖最大匹配(匈牙利算法)

#講解
匈牙利算法,(俗稱“找妹子算法”),是一種求二分圖最大匹配的常用算法。
爲什麼叫“找妹子算法”呢?
這是因爲它的實現原理很像在找妹子:
首先,我們把一堆點分成兩邊(這纔是“二分”,不是真正的“二分”):
這裏寫圖片描述
男女生兩個點之間連一條線表示他們互相喜歡
現在我們要求儘量每個人都找到妹子的最大匹配。
我們首先看,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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章