https://www.luogu.org/problemnew/show/P3386
#include<cstdio>
int e[1005][1005],match[1005],book[1005]; // match数组用来记录配对关系
int n,m,t;
int dfs(int u)
{
for(int v=1; v<=m; v++)
{
if(book[v]==0&&e[u][v]==1)
{
book[v]=1; // 标记v点已经被访问
if(match[v]==0||dfs(match[v])) // 如果点v未被配对,或者点v的匹配对象找到了新的配对。
{
match[v]=u; // 更新配对关系
return 1;
}
}
}
return 0;
}
int main()
{
int a,b;
int sum=0;
scanf("%d%d%d", &n, &m, &t);
while(t--)
{
scanf("%d%d", &a, &b);
if(a>n||b>m)
continue;
e[a][b]=1;
}
for(int i=1; i<=n; i++) // 判断每一个左边的点能不能与右边的点形成一个新的增广路(一条路径的起点、终点都是未被配对的点),
{
for(int j=1; j<=n; j++)
book[j]=0; // 清空上次搜索时的标记
if(dfs(i))
sum++;// 可以的话匹配数+1。
}
printf("%d", sum);
}