#include <bits/stdc++.h>
using namespace std;
int n,m,e;
int G[501][501],match[501],vis[501];
int x,y;
int ans;
int dfs(int now)
{
for (int i = 1; i <= m; i++)
{
if(G[now][i] && !vis[i])
{
vis[i] = 1;//被匹配了或者此点没有方案
if(!match[i] || dfs(match[i]))//可以匹配,或者以匹配的点有其他方案
{
match[i] = now;
return 1;
}
}
}
return 0;
}
int main()
{
cin >> n >> m >> e;
for (int i = 1; i <= e; i++)
{
cin >> x >> y;
if( x <= n && y <= m )G[x][y] = 1;
}
for (int i = 1; i <= n; i++)
{
ans += dfs(i);
memset(vis,0,sizeof(vis));
}
cout << ans;
return 0;
}
本质是贪心
流程:
一个一个匹配
遇到匹配过的,取搜那个匹配的点有没有其他的方案,有就结束,没有当前就换点,没点可换,就结束