luogu P3386 【模板】二分图匹配 | 匈牙利算法

 

v个人,e条边,时间复杂度O(ve)

能匹配就尽量匹配,不能匹配就尽可能改变之前的匹配来使这次可以匹配

 

#include<cstdio>
#include<cstring>
using namespace std;
int flg[1010],to[1010],mp[1010][1010];
int n,m,e,ans;
bool find(int x)
{
    for(int i=1;i<=m;i++)
    {
        if(mp[x][i]&&!flg[i])
        {
            flg[i]=1;
            if(find(to[i])||(!to[i]))
            {
                to[i]=x;
                return 1;
            }
        }
    }
    return 0;
}
int main()
{
    scanf("%d%d%d",&n,&m,&e);
    int a,b;
    for(int i=1;i<=e;i++)
    {
        scanf("%d%d",&a,&b);
        if(a>n||b>m) continue;
        mp[a][b]=1;
    }
    for(int i=1;i<=n;i++)
    {
        memset(flg,0,sizeof(flg));
        if(find(i)) ans++; 
    }
    printf("%d",ans);
    return 0;
}

 

posted @ 2019-01-21 21:33  yyyr  阅读(155)  评论(0编辑  收藏  举报