二分图匹配

2018-04-02 17:40:49


#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;
}