常见的二分图匹配算法有匈牙利算法和Hopcroft_Karp算法。其实不仅二分图,即使是有奇环的图以可以用这些算法寻找匹配(边独立集),因为它们都是寻找增广路(交错轨)的算法,而图中没有增广路是得到最大匹配的充要条件(这点还不理解)。
二分图中 点覆盖数=边独立数(匹配数)进而 |V|-点独立数=边独立数 所以大都可以用二分图匹配算法解决
1、匈牙利算法
基本思想:以图(或二部图中的一部)中每个点为起点寻找一条增广路。在此之上有dfs和bfs的写法。dfs适用于稠密图,bfs适用于稀疏图,但渐进时间复杂度都是O(VE)。
dfs版
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define FOR(i,x,y) for(int i=(x);i!=y;++i)
#define maxn 101
int n,match[maxn],vis[maxn];
int mat[maxn][maxn];
int dfs(int u) {
FOR(i,1,n+1) if(mat[u][i]&&!vis[i]) {
vis[i]=1
if(!match[i]||dfs(match[i])) {
match[i]=u;
match[u]=i;
return 1;
}
}
return 0;
}
int max_match() {
int res=0;
FOR(i,1,n+1) {
memset(vis,0,sizeof(vis));
if(!match[i]) res+=dfs(i);
}
ret