通俗易懂的匈牙利演算法
阿新 • • 發佈:2019-02-06
最近複習演算法的時候,發現好多講匈牙利的教材都講的特別噁心,其實這是一個非常容易理解的演算法。
匈牙利演算法主要是求二分圖的最大匹配
主要思想是把左邊的一個個匹配,衝突就嘗試給前面的分配另一個點
下面是詳細解析
我們有四位同學,四個座位,每個同學都有自己喜歡的座位
首先是1號
1號同學直接坐在了A座位上
然後到2號
2號同學也直接坐在了B座位上
到了3號
我的B座位居然給你2號佔了,給我起來
2號同學的屁股暫時從B座位上挪了下來
我們重新給2號找一個位置
2號發現,誒,C座位沒人,我坐
3號也坐在了B座位上
到了4號
那D座位就是我的啦
至此,所有同學圓滿歸位(此處應有熱烈掌聲)
明白了嗎?
下面是程式碼,還不懂的可以藉助程式碼理解
bool find(int k)
{
int i,j;
fo(i,1,a[k][0])//列舉K號同學能夠做的
{
int p=a[k][i];
if (bz[p]==0)//如果我們這次改變還沒有嘗試過給P座位換主人
{
bz[p]=1;//如果嘗試過了後面的遞迴就不用再麻煩了
if (dt[p]==0||find(dt[p])) //如果P座位還沒有人或者能把P座位上的人換個地方
{
dt[p]=k;//那就坐下唄
return 1;
}
}
}
return 0;
}
//下面是主程式的主要部分
fo(i,1,n)一個個人分配
{
memset(bz,0,sizeof(bz));
if (find(i)) s++;//如果他能坐下,答案+1
}