3386 二分图 洛谷luogu [模版]

题目背景

二分图

感谢@一扶苏一 提供的hack数据

题目描述

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

输入输出格式

输入格式:

第一行,n,m,e

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

输出格式:

共一行,二分图最大匹配

输入输出样例

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

说明

n,m leq 1000n,m1000, 1 leq u leq n1un, 1 leq v leq m1vm ,e le n imes men×m

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

算法:二分图匹配

----------------------cut-------------------------------------------------------------------------------------------------

#include<bits/stdc++.h>

int n,m,e,ans=0,mp[10000][10000],flg[10000],folw[10000],u,v;

bool find(int x)
{
for(int i=1;i<=m;i++)
{
if(mp[x][i] && !flg[i])
{
flg[i] = 1;
if(find(folw[i]) || !folw[i]) // 继续找 或 没有其他的点与i项相连
{
folw[i] = x;
return 1;
} //判断是不是唯一对应
}
}
return 0;
}

int main()
{
scanf("%d%d%d",&n,&m,&e);
for(int i=1;i<=e;i++)
{
scanf("%d%d",&u,&v);
mp[u][v]=1; //u和v匹配 标记
}
for(int i=1;i<=n;i++)
{
memset(flg,0,sizeof(flg)); // 赋初值为0
if(find(i))
ans++;
}
printf("%d",ans);
return 0;
}

原文地址:https://www.cnblogs.com/darlingroot/p/10297472.html