AcWing 861. 二分图的最大匹配
原题链接
简单
作者:
wugensheng
,
2021-04-09 22:27:53
,
所有人可见
,
阅读 265
二分图的最大匹配
- 边的关系是单向的,左侧男生指向右侧女生
- 扫描左侧每个男生,看能不能匹配到女生,如果心意女生已经匹配,试图改变匹配,若所有女生均失败,则无法匹配
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int n1, n2, m;
const int N = 510, M = 100010;
bool st[N]; //标记每次妹子有没有被锁定,锁定之后,不能再去询问
int match[N]; // 存每个妹子对应的左侧的男生的序号
int h[N], e[M], ne[M], cnt; // 没条边指向的节点,是右侧集合中的女生
bool find(int x) {
for (int i = h[x]; ~i; 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;
}
void add(int a, int b) {
e[cnt] = b, ne[cnt] = h[a], h[a] = cnt++;
}
int main() {
cin >> n1 >> n2 >> m;
int res = 0;
memset(h, -1, sizeof h);
for (int i = 0; i < m; i++) {
int a, b;
cin >> a >> b;
add(a, b);
}
for (int i = 1; i <= n1; i++) { //每次只统计左侧男生是否能配对成功
memset(st, 0, sizeof st); // 每次将所有妹子解锁
if (find(i)) res++;
}
cout << res << endl;
return 0;
}