1. 程式人生 > >匈牙利算法自主總結

匈牙利算法自主總結

dash 來講 clas 成功 text 自主 ++ i++ memset

看原理之前我們先來了解——匈牙利概念

在我們理解概念之後,我們知道這是一個優化時間的算法

至於原理是什麽我們現在來講(以下圖片由一只秀逗提供)

首先我們先來放一張男女找伴侶的圖

技術分享圖片

是不是有種鮮花插在牛糞上的感腳

我們看他們相互的連線,所連的線表示男生對某個女生有好感

那麽我們男生按編號從小到大來找對象

很顯然1——>1 2——>2,但是到3號的時候發現跟一號是情敵

那怎麽辦呢?我們假設三號搶的過一號那麽一號女生讓給了三號

還好一號還喜歡二號女生,那麽我們把二號女生給一號

但是之前二號男生喜歡二號女生,那麽只能受委屈

喜歡另一個目標——三號女生

這樣前三位男生就不再沖突了

技術分享圖片

就是這種情況(藍線表示兩兩相對關系)

那麽,我們只能恭喜四號男生找到了最漂亮的女生

其實這種找對象方法是一個遞歸的過程

那麽匈牙利算法就是這種原理——有條件就上,沒條件就創造條件上

那麽我們來看匈牙利算法的板子

bool find(int x){
    int i,j;
    for (j=1;j<=m;j++){    //掃描每個妹子
        if (line[x][j]==true && used[j]==false)      
        
//如果有曖昧並且還沒有標記過(這裏標記的意思是這次查找曾試圖改變過該妹子的歸屬問題,但是沒有成功,所以就不用瞎費工夫了) { used[j]=1; if (girl[j]==0 || find(girl[j])) { //名花無主或者能騰出個位置來,這裏使用遞歸 girl[j]=x; return true; } } } return false; }

主程序是這樣的

for (i=1;i<=n;i++)
{
    memset(used,0,sizeof(used));    //這個在每一步中清空
    if find(i) all+=1;
}

我們現在就可以做題啦

推薦一道水題——luogu P2071

再次感謝一只秀逗提供思路

匈牙利算法自主總結