【二分图匹配】洛谷P3386

题目背景

二分图

题目描述

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

输入输出格式

输入格式:

第一行,n,m,e

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

输出格式:

共一行,二分图最大匹配

输入输出样例

输入样例#1:
1 1 1
1 1
输出样例#1:
1 

说明

 1≤n,m1000, 1un, 1vm

因为数据有坑,可能会遇到v>m 的情况。请把 v>m 的数据自觉过滤掉。

算法:二分图匹配

/********************************************/

匈牙利算法emmmmm

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define ll long long
using namespace std;
const ll maxn=1010;
ll n,m,e,ans=0,match[maxn];
bool vis[maxn],flag[maxn][maxn];
bool dfs(ll x)
{
    for(ll i=1;i<=m;i++)
    {
        if(!vis[i]&&flag[x][i])
        {
            vis[i]=true;
            if(!match[i]||dfs(match[i]))
            {
                match[i]=x;
                return true;
            }
        }
    }
    return false;
}
int main()
{
    scanf("%lld%lld%lld",&n,&m,&e);
    memset(flag,0,sizeof(flag));
    for(ll i=1;i<=e;i++)
    {
        ll u,v;
        scanf("%lld%lld",&u,&v);
        if(v<=m) flag[u][v]=true;
    }
    for(ll i=1;i<=n;i++)
    {
        memset(vis,0,sizeof(vis));
        ans+=dfs(i);
    }
    printf("%lld",ans);
    return 0;
}
原文地址:https://www.cnblogs.com/Koiny/p/9883119.html