洛谷—— P3386 【模板】二分圖匹配
阿新 • • 發佈:2017-05-21
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 returnfalse; 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 【模板】二分圖匹配