匈牙利演算法是用來求二分圖匹配的演算法,一般有bfs和dfs兩種實現,我一般都是寫的dfs的實現,感覺這個比較好理解,實現也比較簡單。
二部圖:若乙個圖的頂點可以劃分到2個集合,使得每個集合內的頂點之間沒有連邊,那麼這個圖就叫做二分圖或二部圖。
二分匹配問題:求最大邊無關集。
交替鏈:二分圖的一條路徑,路徑的起點和終點來自於不同的集合,且均未被標記(未匹配),且路徑中的相鄰結點來自不同的集合。
匈牙利演算法:存在交替鏈<=>存在更優匹配
為什麼在maxmatch中只需對每個結點一次求一次交替鏈即可?
答:因為每求一次交替鏈後,可能增加匹配成功的結點,上一次匹配成功的結點不會變(匹配方式可能變了),而交替鏈是否存在與匹配成功的結點有關,所以若第一次求從某個點出發不存在交替鏈,則以後求也不會存在交替鏈,所以掃瞄一遍即可。
//求是否存在交替鏈
int path(int u)
}return 0;
}//求最大匹配數
int maxmatch()
}
二分匹配 匈牙利演算法
這個演算法真心很精妙,其實 很簡單,但是理解其中的奧秘還真要花點時間 matrix67大牛說的好 說穿了,就是你從二分圖中找出一條路徑來,讓路徑的起點和終點都是還沒有匹配過的點,並且路徑經過的連線是一條沒被匹配 一條已經匹配過,再下一條又沒匹配這樣交替地出現。找到這樣的路徑後,顯然路徑裡沒被匹配的連...
二分匹配 匈牙利演算法
奆佬的部落格 匈牙利演算法是由匈牙利數學家edmonds於1965年提出,因而得名。匈牙利演算法是基於hall定理中充分性證明的思想,它是部圖匹配最常見的演算法,該演算法的核心就是尋找增廣路徑,它是一種用增廣路徑求二分圖最大匹配的演算法。等等,看得頭大?那麼請看下面的版本 通過數代人的努力,你終於趕...
二分匹配之匈牙利演算法
二分匹配之匈牙利演算法 一 概念 二分圖 把點分為兩個集合,在同乙個集合的點之間不能有邊,也就是說邊只能存在於分別來自兩個集合的點間,這樣的圖就是二分圖。最大二分匹配 在原二分圖上通過刪除一些邊,來保證每個點只能與乙個點相連 一一對應 能保留最多的邊數,這個邊數就是最大二分匹配 二 演算法步驟 1 ...