1. 程式人生 > >通俗易懂的匈牙利演算法

通俗易懂的匈牙利演算法

最近複習演算法的時候,發現好多講匈牙利的教材都講的特別噁心,其實這是一個非常容易理解的演算法。

匈牙利演算法主要是求二分圖的最大匹配

主要思想是把左邊的一個個匹配,衝突就嘗試給前面的分配另一個點

下面是詳細解析

我們有四位同學,四個座位,每個同學都有自己喜歡的座位
這裡寫圖片描述

首先是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 }