前言
二分图最大匹配对应的实际情况可能是男女交朋友,当男二发生冲突的时候,看一下冲突的男一能不能换一个女生…只有尝试所有可能性都无法满足需求的时候,男二才会放弃。配一则y总的真实图片:
一、题目陈述
二、解决思路
发生冲突就找增广路径,直到尝试所有的可能性,时间复杂度是O(nm)
。
三、代码实现
#include<iostream>
#include<cstring>
using namespace std;
const int N=510,M=1e5+10;
int n1,n2,m;
int h[N],e[M],ne[M],idx;
void add(int a,int b) {
e[idx]=b;
ne[idx]=h[a];
h[a]=idx++;
}
// st数组存储在为某个男生找匹配时,某个女生是否已经考虑过
bool st[N];
// match数组存储每个女生对应匹配的男生
int match[N];
bool find(int x) {
// 枚举所有看上的女生
for(int i=h[x];i!=-1;i=ne[i]) {
int j=e[i];
if(!st[j]) {
st[j]=true;
// 这个女生还没有匹配 或者 冲突后能给那个男生找到下家
if(match[j]==0 || find(match[j])) {
match[j]=x;
return true;
}
}
}
return false;
}
int main() {
cin>>n1>>n2>>m;
memset(h,-1,sizeof h);
for(int i=0;i<m;i++) {
int a,b; cin>>a>>b;
add(a,b);
}
int res=0;
// 枚举每个男生
for(int i=1;i<=n1;i++) {
// 把所有女生清空
memset(st,false,sizeof st);
if(find(i)) res++;
}
cout<<res<<endl;
return 0;
}
总结
匈牙利算法搭配男女生找对象的例子非常好理解,代码也好写。