【模板】匈牙利算法 二分图匹配 (模版题:洛谷P3386)

题目背景

二分图

题目描述

给定一个二分图,结点个数分别为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
#include
#include
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 <



你可能感兴趣的:(图论,--------,二分图匹配)