1. 程式人生 > >洛谷—— P3386 【模板】二分圖匹配

洛谷—— P3386 【模板】二分圖匹配

blank lan print 一個 dfs com 二分 i++ bool

https://www.luogu.org/problem/show?pid=3386

題目背景

二分圖

題目描述

給定一個二分圖,結點個數分別為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

因為數據有坑,可能會遇到v>m的情況。請把v>m的數據自覺過濾掉。

算法:二分圖匹配

匈牙利算法:技術分享

 1 #include <algorithm>
 2 #include <cstring>
 3 #include <cstdio>
 4 
 5 using namespace std;
 6 
 7 const int N(1010);
 8 int n,m,e,u,v,ans;
 9 int map[N][N];
10 
11 int match[N],vis[N];
12 
13 bool DFS(int now)
14 {
15     for(int i=1;i<=m;i++)
16 if(map[now][i]&&!vis[i]) 17 { //有好感 正單身 18 vis[i]=1; //嘗試一下 19 if(!match[i]||DFS(match[i])) 20 { //對方正單身, 對方開始嘗試 21 match[i]=now; //嘗試成功 22 return true; 23 } 24 } 25 return
false; 26 } 27 28 int main() 29 { 30 scanf("%d%d%d",&n,&m,&e); 31 for(;e;e--) 32 { 33 scanf("%d%d",&u,&v); 34 if(u>n||v>m) continue; 35 map[u][v]=1; 36 } 37 for(int i=1;i<=n;i++) 38 { 39 memset(vis,0,sizeof(vis)); 40 if(DFS(i)) ans++; //配對成功 41 } 42 printf("%d\n",ans); 43 return 0; 44 }

洛谷—— P3386 【模板】二分圖匹配