题目描述
给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数
输入格式
第一行,n,m,e
第二至e+1行,每行两个正整数u,v,表示u,v有一条连边
输出格式
共一行,二分图最大匹配
输入输出样例
输入 #1
1 1 1
1 1
输出 #1
1
说明/提示
n,m≤1000 1≤u≤n, 1≤v≤m ,e≤n×m
因为数据有坑,可能会遇到 v>m 或者 u>n 的情况。请把 v>m 或者 u>n 的数据自觉过滤掉。
算法:二分图匹配
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#define N 2010
using namespace std;
int n,m,e,ans;
int vis[N][N];
int ask[N],matched[N];
inline bool found(int x){
for (int i = 1 ; i <= m ; i++)
if (vis[x][i]){
if (ask[i]) continue;
ask[i] = 1;
if (!matched[i] || found(matched[i])) {
matched[i] = x ;
return true;
}
}
return false;
}
inline void match(){
int cnt = 0;
memset(matched,0,sizeof(matched));
for (int i = 1 ; i <= n ; i++){
memset(ask,0,sizeof(ask));
if(found(i)) cnt++;
}
ans = cnt;
}
int main(){
scanf("%d%d%d",&n,&m,&e);
for (int i = 1 ; i <= e ; i++){
int x,y;
scanf("%d%d",&x,&y);
vis[x][y] = 1;
}
match();
printf("%d \n",ans);
return 0;
}