AcWing 861. 二分图的最大匹配
原题链接
简单
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
const int N = 510;
int n1, n2, m;
vector<int> adj[N]; // 使用 vector 作为邻接表
int match[N];
bool st[N];
void add(int a, int b)
{
adj[a].push_back(b); // 添加边到邻接表
}
bool find(int x)
{
for (int j : adj[x]) // 遍历与 x 相邻的所有点
{
if (!st[j])
{
st[j] = true;
if (match[j] == 0 || find(match[j]))
{
match[j] = x;
return true;
}
}
}
return false;
}
int main()
{
scanf("%d%d%d", &n1, &n2, &m);
while (m--)
{
int a, b;
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++;
}
printf("%d\n", res);
return 0;
}