二分匹配 (匈牙利演算法及模板)
阿新 • • 發佈:2018-11-30
二分匹配我認為其實就是m個女生,n個男生相互認識的在一起,求最大匹配成的對數。
二分匹配的時間複雜度是O(NM)
相關概念:
最大匹配數:最大匹配的匹配邊的數目
- 定理1:最大匹配數 = 最小點覆蓋數(這是 Konig 定理)
- 定理2:最大獨立集 = 頂點數 - 最小點覆蓋數
- 定理3:最小路徑覆蓋數 = 頂點數 - 最大匹配數
最大完全數:圖中最大完全子圖的頂點個數。
獨立集:圖中任意兩個頂點都不相連的頂點集合。
獨立數:獨立集中頂點的個數
完全子圖:任意兩點都相連的頂點的集合
最大完全數(最大團)=原圖的補圖的最大獨立數
模板:
#include<stdio.h> #include<string.h> int map[110][110],book[110],match[110]; int n,m; int dfs(int u) { int i; for(i=1;i<=n;i++) { if(book[i]==0&&map[u][i]==1) { book[i]=1; if(match[i]==0||dfs(match[i])) { match[i]=u; return 1; } } } return 0; } int main() { int i,sum,a,b; sum=0; memset(map,0,sizeof(map)); memset(match,0,sizeof(match)); scanf("%d%d",&n,&m); for(i=1;i<=m;i++) { scanf("%d%d",&a,&b); map[a][b]=1; } for(i=1;i<=n;i++) { memset(book,0,sizeof(book)); if(dfs(i)) sum++; } printf("%d\n",sum); return 0; }
KM演算法: