【模板】二分图匹配

题目描述

给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数

输入输出格式

输入格式:

 

第一行,n,m,e

第二至e+1行,每行两个正整数u,v,表示u,v有一条连边

 

输出格式:

 

共一行,二分图最大匹配

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

int n, m, e, a[1010][1010], pipei[1010], flag[1010], ans;

bool dfs(int u)
{
    for (int i = 1; i <= m; i++)
    {
        if (a[u][i])
        {
            if (!flag[i])
            {
                flag[i] = 1;
                if (!pipei[i] || dfs(pipei[i]))
                {
                    pipei[i] = u;
                    return true;
                }
            }
        }
    }
    return false;
}

int main()
{
    scanf("%d%d%d", &n, &m, &e);
    for (int i = 1; i <= e; i++)
    {
        int u, v;
        scanf("%d%d", &u, &v);
        if (u <= n && v <= m)
            a[u][v] = 1;
    }
    for (int i = 1; i <= n; i++)
    {
        memset(flag, 0, sizeof(flag));
        if (dfs(i))
            ans++;
    }
    printf("%d\n", ans);

    return 0;
}

 

posted @ 2017-11-10 19:10  zbtrs  阅读(187)  评论(0编辑  收藏  举报