【模板】匈牙利演算法 二分圖匹配 (模版題:洛谷P3386)
阿新 • • 發佈:2019-02-14
題目背景
二分圖
題目描述
給定一個二分圖,結點個數分別為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; }