【模板】匈牙利算法 二分图匹配 (模版题:洛谷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<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;
}



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值