一、题目链接
二、题目分析
(一)算法标签
匈牙利算法
(二)解题思路
三、AC代码
解法一:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 510, M = 1e5 + 10;
int h[N], e[M], ne[M], idx;
void add(int a, int b)
{
e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
}
int n1, n2, m;
int a, b;
int match[N]; // 女生配对的男生是谁
bool st[N]; // 女生是否有配对的男生
bool find(int u) // 男生u是否能找到女生
{
for (int i = h[u]; ~i; i = ne[i])
{
int j = e[i];
if (!st[j])
{
st[j] = true;
// 女生j没有找到男生 或者 女生j已经找到的男生可以找到其他女生
if (!match[j] || find(match[j]))
{
match[j] = u;
return true;
}
}
}
return false;
}
int main()
{
memset(h, -1, sizeof h);
cin >> n1 >> n2 >> m;
for (int i = 0; i < m; i ++ )
{
scanf("%d%d", &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;
}