前言:
匈牙利算法主要是解决二分图最大匹配问题,它用一句话总结就是“先到先得,能让就让”
这里是很板子裸匈牙利算法的一题,当然,比赛的题就没这么裸了,需要我们仔细观察。同裸的一题还有洛谷的
P3386 【模板】二分图最大匹配
题目:
思路
女生男生分别作为二分图的两部分,不能女生选女生男生选男生,显然是二分图的最大匹配。
代码
#include <bits/stdc++.h>
using namespace std;
const int maxn=5e2+10;
#define faster ios::sync_with_stdio(false);cin.tie(0),cout.tie(0)
int link[maxn][maxn],use[maxn],ptn[maxn];
int k,m,n;
bool find(int x){
for (int i = 1; i <= n; ++i) { //从第一个男生开始选择,直到女生愿意和当前这个男生坐并且这个男生这一轮没有被选择过
if (link[x][i]&&!use[i]){
use[i]=1;
if (!ptn[i]|| find(ptn[i])){ //这个男生没有partner或者这个男生的partner可以腾出位置来
ptn[i]=x; //这个男生的partner就为当前这个女生
return true;
}
}
}
return false;
}
int match(){
int sum=0;
for (int i = 1; i <= m; ++i) { //对每个女生进行选择操作
memset(use,0,sizeof use); //use表示每一轮的男生是否被选择过
if (find(i)) sum++;
}
return sum;
}
signed main(){
faster;
while (cin >> k && k){
cin >> m >> n;
memset(link,0,sizeof link);
memset(ptn,0,sizeof ptn);
for (int i = 0; i < k; ++i) {
int x,y; cin >> x >> y;
link[x][y]=1;
}
cout << match() << endl;
}
return 0;
}