一:關於二分圖最大匹配的兩個定理:
1:最大匹配數 + 最大獨立集 = n + m(n,m為二部圖兩部分的個數)
2:二分圖的最小覆蓋數 = 最大匹配數
3:最小路徑覆蓋 = 最大獨立集
最大獨立集是指求一個二分圖中最大的一個點集,該點集內的點互不相連。
最小頂點覆蓋是指 在二分圖中,用最少的點,讓所有的邊至少和一個點有關聯。
最小路徑覆蓋是指一個不含圈的有向圖G中,G的一個路徑覆蓋是一個其結點不相交的路徑集合P,圖中的每一個結點僅包含於P中的某一條路徑。路徑可以從任意結點開始和結束,且長度也為任意值,包括0
關於二分圖最大匹配演算法:http://blog.csdn.net/no_retreats/article/details/7854091
常見的建圖模型:(以下是參照其他資源小結的)
模型一:行列匹配法
如所述是一個3*3的矩陣,其中1表示有敵人,0表示沒有敵人。我們現在有多支箭,而且每支箭能夠殺死一行或者一列的敵人,問題是我們要殺死所有的敵人至少需要多少支箭?
初初看來和二分圖是沒有什麼聯絡,不過我們可以試試換個角度去思考問題,我們想要殺死敵人是不是只要有箭經過他就行了是吧,也就是說所有的敵人被箭覆蓋過就行了。嗯,沒錯,就是覆蓋,最小頂點覆蓋。既然我們要殺的是敵人,那麼我們的點就應該是敵人的位置,只要有箭經過敵人的位置,那敵人就被我們殺死了有木有。所以我們要依據點來建圖,將點的橫座標看成是二分圖的X部分,縱座標看成是二分圖的Y部分。由可知敵人的位置在((1,1),(1,3),(2,2),(3,1)),因此我們就用座標的橫縱座標來見二分圖了,其中用邊相連的邊即為敵人所在的點了。
,一個二分圖的最小頂點覆蓋就是要找到最少的邊把所有的頂點覆蓋,正好符合這個題的要求,上面還給出了一個性質,即二分圖的最小頂點覆蓋是等於二分圖的最大匹配。所以我們只需要對上面的那個二分圖就最大匹配就行,這樣把原本的問題轉變的很簡單了
模型二:黑白染色法
如還是一個3*3的矩陣,現在的問題就是讓你把圖中的1變為0,而且一次最多隻能修改相鄰的兩個,問至少需要多少次的修改才能把所有的1修改為0?似乎用貪心,DP都派不上用場,當然在這裡提出是要用二分圖最大匹配來求解了,這裡的關鍵是如何建圖?既然是每次只能拿相鄰的兩個,是兩個,正好我們匹配的時候也是找兩個進行匹配,這就是這個問題和最大二分圖匹配問題相聯絡的地方。但是每個點能和他四周的四個點匹配,那麼我們怎麼把所有的點分成來那個部分呢? 一個解決辦法就是要把第i個點放到第一部分,第i個點周圍的四個點放到第二部分,再把這四個點周圍的16點放到第1部分
有了這樣的思想,我們只需對原圖做這樣的改動:黑白染色使四周和中間的顏色不同。
圖中黑白的意思是就是把點分類,圖裡的1,2,3,4,5,6表示的就是上面那個0,1圖的1的個數
然後建圖,把相鄰的點相連,比如說1和2 2和3 。。。。。。。
然後要把所有一改為零,也就是要對每個點都操作,每個點都要有,那不就是最小頂點覆蓋嗎?嗯,是的,還是最小頂點覆蓋。