1. 程式人生 > >【模板】匈牙利演算法 二分圖匹配 (模版題:洛谷P3386)

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