例题CDUTCM1650
这就是一个裸的匈牙利算法
AC代码与注释
#include<bits/stdc++.h>
using namespace std;
const int N=1005;
int line[N][N]; //存放数据
int boy[N],used[N]; //与男生配对的女生编号boy[N],与被用了的男生used[N]
int k,m,n;
bool found(int x){
for(int i=1;i<=n;i++){
if(line[x][i]&&!used[i]){ //女生愿意并且男生没有匹配
used[i]=1; //标记该男生为已经匹配
if(boy[i]==0||found(boy[i])){ //如果男孩没有女孩匹配,或者与此男孩匹配的女孩能找的到其他的男孩匹配
boy[i]=x; //将该女孩与此男孩匹配
return true; //匹配成功,返回1
}
}
}
return false; //没找到,返回false
}
int main(){
int x,y;
while(cin>>k>>m>>n){
memset(line,0,sizeof(line));
memset(boy,0,sizeof(boy));
for(int i=0;i<k;i++){
scanf("%d%d",&x,&y);
line[x][y]=1; //邻接矩阵存放数据
}
int sum=0;
for(int i=1;i<=m;i++){ //为每个女生尽可能找匹配
memset(used,0,sizeof(used));
if(found(i)) //找到
sum++;
}
cout<<sum<<endl;
}
return 0;
}
//二分匹配问题模板题之匈牙利算法
/**************************************************************
Problem: 1650
User: 201744901029
Language: C++
Result: 正确
Time:460 ms
Memory:5972 kb
****************************************************************/