O ( V*E )
一个二分图的最大匹配=最小顶点覆盖
其实匈牙利算法就是最大流算法,只不过它的使用范围仅限于二分图。
求最多可以有几个男女相互匹配:
int n,match[n],map[n][m]; // n个女的, m个男的, match[i]表示第i个女生匹配的男生号
bool vis[n];
bool dfs(int p){
for(int i=1;i<=n;i++){
if(map[i][p]&&!vis[i]){
vis[i]=true;
if(match[i]==-1||dfs(match[i]){ // 如果她还没被匹配或者她匹配的人能另找一个男生,那就匹配她
match[i]=p;
return true;
}
}
}
return false;
}
int hungary(){
int ans=0;
memset(match,-1,sizeof(match));
for(int i=1;i<=m;i++){
memset(vis,false,sizeof(vis));
if(dfs(i))ans++;
}
return ans; // 返回最大匹配
}