匈牙利算法:它由匈牙利數學家Edmonds於1965年提出,因而得名。此算法的核心就是尋找增廣路徑,通過增廣路徑來求二分圖最大匹配的一種算法。
通過這個圖片來講述一下。黑色代表A\B\C\D四只小狗,紅色代表四種口味的骨頭,每一條線表示的是小狗喜歡吃這個口味的骨頭。
我們按照順序給小狗們分配骨頭,先給A分配,很明顯a無人占用並且小A狗很喜歡,分配,博主最喜歡成人之美。(✿◡‿◡)
現在給小B狗分配,小B喜歡b,前提b無人占用並且小B心儀很久,又成全一只小狗,哇哈哈~~
輪到小C狗了,小C等了好久了,但是小C喜歡的骨頭全都被占了,好可憐有木有,但是沒關系,我們想辦法來幫助他。如下圖。
通過這張圖,我們可以很清晰的知道,我們把A的先拿掉,但是還是要給找一個,不然豈不是太偏心,給A找到b,但是b被占了,同理,也先拿掉,這樣A滿足了,在給B繼續找, 這樣我們就找到c,ok大家都可以找到后備胎了,那么小C可以吃a!!!同理對d一樣,但是發現如果滿足d,其他的都會被破壞,綜上,得到最大的匹配值為3。
匈牙利算法的流程就是上述的方案。
以下是一些技巧總結。
二分圖的最小頂點覆蓋:在二分圖中求最少的邊,讓每條邊至少和其中的一個點關聯
最小頂點覆蓋=最大匹配數
DAG圖(無回路有向圖(Directed Acyclic Graph))的最小路徑覆蓋:用盡量少的不想交的簡單路徑覆蓋圖中的所有頂點
最小路徑覆蓋=頂點數-最大匹配數
無向圖的最小路徑覆蓋:
無向二分圖的最下路徑覆蓋=頂點數-最大二分匹配/2(因為無向圖就是雙向的一條邊等於兩次入圖正向和反向,最后得到的匹配數多了一倍所以要除以2才是原本的匹配數)
點可以重復走的最小路徑覆蓋:
【題意】:派機器人去火星尋寶,給出一個無環的有向圖,機器人可以降落在任何一個點上,再沿着路去其他點探索,我們的任務是計算至少派多少機器人就可以訪問到所有的點。有的點可以重復去。
【思路】:我們仍可將問題轉換為最小路徑覆蓋。如果一個人需要經過另一個人走過的點時候,讓他直接從該點上空飛過去,越過該點,直接走下一個點。如果我們賦予每個人這種能力,那么求得的無重復點的最小路徑覆蓋結果,就是題目要求的結果,因為需要重復的地方只要飛過去,就可以不重復了。賦予這個能力的方法就是吧所有點能間接到達的點全都改為直接到達。
二分圖的最大獨立集:在二分圖中任意兩點都不相鄰的頂點的最大集合
最大獨立集=結點數-最大匹配數
二部圖的多重匹配:一般的二部圖只能匹配一個點,在多重匹配中,一個點可以匹配多給點
