匈牙利算法(二分图)

Posted by Songtoy on 2017-09-04

匈牙利算法

又称增广路算法,可用于求解二分图最大匹配.

增广路:一条由“非匹配边”——“匹配边”——“非匹配边”…..——“匹配边”——“非匹配边”交错构成的路径,又称交错轨,增广路有一个很好的性质就是,非匹配边的条数恰好比匹配边的条数多1,这样如果将增广路上所有非匹配边反转成匹配边,所有匹配边反转成非匹配边,会发现匹配边多了1,

匈牙利算法就是这样一个不断调整得到最优解的过程.复杂度$O(nm)$

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
bool dfs(int u){
vis[u]=true;
for(int i=0;i<es[u].size();++i){
int v=es[u][i];
if(!vis[v]){
vis[v]=true;
if(match[v]==-1||dfs(match[v])){
match[v]=u;
return true;
}
}
}
return false;
}
int Solve(int r,int b){
memset(match,-1,sizeof(match));
int ans=0;
for(int i=0;i<clr[b].size();++i){
memset(vis,false,sizeof(vis));
if(dfs(clr[b][i]))++ans;
}
return ans;
}