匈牙利算法小结
關于匈牙利算法的小結
二分圖定義:
兩個非空集合A, B A與B沒有交集,同一集合內部沒有連邊,這個圖為二分圖,A為左部,B為右部。
判定:
二分圖不存在奇環。
用染色法即可。
NOIP2010關押罪犯
二分圖最大匹配
二分圖沒有增廣路時,就是最大匹配。
特點:當一個點成為匹配點后,至多找到增廣路更換匹配對象,但是絕不會變回非匹配點。
時間復雜度 \(O(nm)\)
匈牙利算法代碼框架(模板)
只用從左向右建單向邊!!
建議使用vector
題目 && 模型
Round1
1.棋盤覆蓋
題解
二分圖匹配的0/1要素:
0要素:點能分成兩個獨立的集合,每個集合內部沒有邊
1要素:每個點只能有一條匹配邊相連
這題將骨牌看做邊,格子看做點,建模。
同類題: 車的放置
2.導彈防御塔
二分圖多重匹配,拆點,或使用網絡流,一般使用網絡流。
3.二分圖帶權匹配
網絡流吧。
Round2
1. 二分圖最小點覆蓋Machine Schedule
定理:二分圖最小點覆蓋=最大匹配邊數。
模型特點:每條邊有兩個端點,兩者至少選一個
同類題Muddy Fields, POJ3041
2. 二分圖最大獨立集騎士放置
定理:二分圖最大獨立集=節點數-最大匹配數
3. \({\rm DAG}\)最小路徑點覆蓋
給一個 \({\rm DAG}\) ,要求用盡量少的不相交的簡單的路徑,覆蓋 \({\rm DAG}\) 的所有頂點。
定理:\({\rm DAG}\)的最小路徑點覆蓋包含的路徑條數 = 點數 - 拆點二分圖最大匹配數
拆點二分圖:設 \({\rm DAG}\) 為 \({\rm G=(V,E)}\),拆點二分圖為 \({\rm G'=(V',E')}\) 將G中的每一個點 \(x\) 拆成左部節點 \(x\) 與右部節點 \(x+n\) , 對于 \({\rm E(x, y)}\) 在 \({\rm G'}\) 中連單向邊 \({\rm E'(x, y + n)}\) , 得到的 \({\rm G'}\) 就是拆點二分圖。
同類題:魔術球問題 題解 我的代碼
Round3
1.[SCOI2010]連續攻擊游戲
Sol. code
每個集合只能選一個元素的模型
2.[ZJOI2007]矩陣游戲
Sol. and code
棋盤模型
3.[NOI2009]變換序列
Sol. and code
匈牙利算法的本質
4.[HNOI2013]消毒
Sol. and code
枚舉 + 最小點覆蓋模型
5.[SHOI2001]小狗散步
Sol. and code
“Pandog每次與主人相遇之前最多只去一個景點”, 建立二分圖最大匹配的關鍵信息
省選之前就寫這么多了。
轉載于:https://www.cnblogs.com/cnyali-Tea/p/10633114.html
總結
- 上一篇: aidl demo调用原理
- 下一篇: 淘淘商城之配置工程