#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
int n,m,e,ans;
int t[1001][1001];
int dfn[1001],match[1001];
bool dfs(int x)
{
for(int i=1;i<=m;i++)
{
if(t[x][i]==1&&dfn[i]==0)//要求不在交替路中
{
dfn[i]=1;
if(!match[i]||dfs(match[i]))
//// 如果是未盖点,说明交替路为增广路,则交换路径,并返回成功
{
match[i]=x;
return true;
}
}
}
return false;
}
int main()
{
scanf("%d%d%d",&n,&m,&e);
for(int i=1;i<=e;i++)
{
int x,y;
scanf("%d%d",&x,&y);
if(x<=n&&y<=m)t[x][y]=1;
}
for(int i=1;i<=n;i++)
{
memset(dfn,0,sizeof(dfn));
if(dfs(i))ans++;
}
printf("%d",ans);
return 0;
}
二分图匹配
2018-04-02 17:40:49