匈牙利算法自主總結
阿新 • • 發佈:2018-12-24
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
再次感謝一只秀逗提供思路
匈牙利算法自主總結