二分图-匈牙利算法模板
二分圖就不贅述了,我在知識資料整理有相關資料。
.最大匹配 ?.最小路徑覆蓋 ?.最小點覆蓋 ?.最大獨立集
最大匹配:二分圖中邊集最大的那個匹配
最小路徑(邊)覆蓋:用盡量小的不想交簡單路徑覆蓋有向無環圖(DAG)G的所有頂點
最小頂點(點)覆蓋:用最少的點,讓每條邊都至少和其中一個點關聯
最大獨立集:在N個點的圖中選出m個點,使這m個點兩兩之間沒有邊的點中,m的最大值
?
二分圖匹配模型,二分圖有如下幾種常見變形:
1.二分圖的最小頂點覆蓋
最小頂點覆蓋要求用最少的點(x或y中的都行),讓每條邊都至少和其中一個點關聯
knoig定理:二分圖中最小頂點覆蓋等于最大匹配數
?
2.DAG圖中的最小路徑覆蓋
用盡量少的不相交簡單路徑覆蓋DAG的所有頂點,這就是DAG圖的最小路徑覆蓋問題
結論:DAG圖中的最小路徑覆蓋數 = 節點數(n)-最大匹配數(m)
?
3.二分圖的最大獨立集
最大獨立問題:在n個點的圖G中選出m個點,使這m個點兩兩之間沒有邊,求m的最大值
結論:二分圖的最大獨立集數 = 節點數(n)-最大匹配數(m)
?
有一種很經典的二分圖模型,在一個n*n的矩陣中,這個矩陣里面有k個障礙物,你擁有一把武器,一發彈藥一次能消滅一行或者一列的障礙物,求消滅全部障礙物所需的最少彈藥數。
可以這樣考慮:我們以所有行為二分圖的左頂點,所有的列為右頂點,那么如果位于坐標p(x,y)有障礙物,我們就連一條邊,然后我們只需要最少的頂點覆蓋所有的邊即可。這樣就是二分圖的最小頂點覆蓋問題了,我們又知道最大小頂點等于二分圖最大匹配。
?
?
時間復雜度: 鄰接矩陣:?O(n3)鄰接表: O(nm) 空間復雜度: 鄰接矩陣:?O(n2)
鄰接表:O(n+m)
?
/**************************************************** 二分圖匹配(匈牙利算法的DFS實現) INIT:g[][]兩邊定點劃分的情況 CALL:res=hungary();輸出最大匹配數 優點:適于稠密圖,DFS找增廣路快,實現簡潔易于理解 時間復雜度:O(VE); ****************************************************/ const int MAXN=1000; int uN,vN; //u,v數目 int g[MAXN][MAXN];//編號是0~n-1的 int linker[MAXN]; bool used[MAXN]; bool dfs(int u) {int v;for(v=0;v<vN;v++)if(g[u][v]&&!used[v]){used[v]=true;if(linker[v]==-1||dfs(linker[v])){linker[v]=u;return true;} } return false; } int hungary() {int res=0;int u;memset(linker,-1,sizeof(linker));for(u=0;u<uN;u++){memset(used,0,sizeof(used));if(dfs(u)) res++;} return res; } 最大匹配——匈牙利算法?
?
?
?
?
轉載于:https://www.cnblogs.com/Roni-i/p/7475175.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的二分图-匈牙利算法模板的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jsp页面截取字符串,显示指定长度
- 下一篇: 类型和成员基础