簡單粗暴理解匈牙利演算法

2021-10-07 04:58:46 字數 1724 閱讀 3820

**:

【書本上的演算法往往講得非常複雜,我和我的朋友計畫用一些簡單通俗的例子來描述演算法的流程】

匈牙利演算法是由匈牙利數學家edmonds於2023年提出,因而得名。匈牙利演算法是基於hall定理中充分性證明的思想,它是部圖匹配最常見的演算法,該演算法的核心就是尋找增廣路徑,它是一種用增廣路徑求二分圖最大匹配的演算法。

-------等等,看得頭大?那麼請看下面的版本:

通過數代人的努力,你終於趕上了剩男剩女的大潮,假設你是一位光榮的新世紀媒人,在你的手上有n個剩男,m個剩女,每個人都可能對多名異性有好感(

:接著給2號男生找妹子,發現第乙個和他相連的2號女生名花無主,got it

:接下來是3號男生,很遺憾1號女生已經有主了,怎麼辦呢?

我們試著給之前1號女生匹配的男生(也就是1號男生)另外分配乙個妹子。

(黃色表示這條邊被臨時拆掉)

與1號男生相連的第二個女生是2號女生,但是2號女生也有主了,怎麼辦呢?我們再試著給2號女生的原配()重新找個妹子(注意這個步驟和上面是一樣的,這是乙個遞迴的過程)

此時發現2號男生還能找到3號女生,那麼之前的問題迎刃而解了,回溯回去

2號男生可以找3號妹子~~~                  1號男生可以找2號妹子了~~~                3號男生可以找1號妹子

所以第三步最後的結果就是:

: 接下來是4號男生,很遺憾,按照第三步的節奏我們沒法給4號男生騰出來乙個妹子,我們實在是無能為力了……香吉士同學走好。

這就是匈牙利演算法的流程,其中找妹子是個遞迴的過程,最最關鍵的字就是「

騰」字其原則大概是:有機會上,沒機會創造機會也要上

【code】

bool

find

(int x)}}

return

false;

}

在主程式我們這樣做:每一步相當於我們上面描述的一二三四中的一步

for (i=

1;i<=n;i++)

C memset簡單粗暴的理解

memset函式本來是c語言中對char陣列的整體賦值函式。但是我們一般都是要用它來對int陣列或者其他型別的陣列進行整體初始化。具體操作如下 int array 10 memset array,0,sizeof array int array 10 memset array,1 sizeof ar...

如何簡單粗暴理解函式

一 初次見面,請多關照。計算列表內的元素個數。用程式設計去計算 li 1,2,3,4,5,6,6,5,4 count 0 for i in li count 1 print count 如果再計算字串的元素個數還得再寫一段同樣的 重複 較多。可讀性差。解決上述問題就需要 函式式程式設計 用函式去計算...

簡單粗暴地理解動態規劃

動態規劃可以說是做題時比較難以理解的演算法了,我之前也不是很理解,直到在隨機過程中學習了馬爾科夫過程後,再看動態規劃就覺得很簡單了。本文只是幫助簡單粗暴的理解動態規劃,熟練地運用需要親自進行大量的習題練習。一 動態規劃適合解決什麼樣的問題?1 問題具有最優子結構 舉乙個直白易懂的例子 求你走路的時候...