题目背景
二分图
题目描述
给定一个二分图,结点个数分别为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
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int x,y,L,R,m;
int link[1001];
bool use[1001];
bool b[1001][1001];
bool dfs(int k){//找k是否能匹配(k总是在左边)
for (int i=1;i<=R;++i)
if (b[k][i]&&!use[i]){//存在边且未被匹配
use[i]=true;
if (!link[i]||dfs(link[i])){
//如果没有被牵线或牵线者存在另一种匹配
link[i]=k;return true;
}
}
return false;
}
int main(){
cin >>L>>R>>m;
for (int i=1;i<=m;++i){cin >>x>>y;b[x][y]=true;}
int ans=0;
for (int i=1;i<=L;++i){
memset(use,0,sizeof(use));
if (dfs(i)) ans++;
}
cout <<ans<<endl;
return 0;
}