1. 程式人生 > 實用技巧 >洛谷 P3386 【模板】二分圖最大匹配

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

題目傳送門

解題思路:

匈牙利演算法求二分圖最大匹配,其過程為:當男生i要和女生j匹配時,如果j還沒有匹配,那就i和j匹配;如果j先前已經和男生k匹配了,那就讓k再去找別的女生匹配,如果找到了,i和j匹配,如果找不到,i只能當光棍。

AC程式碼:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring> 
 4 
 5 using namespace std;
 6 
 7 int n,m,e,head[501],tot,ans,p[501];
 8 bool vis[501];
 9 struct
kkk{ 10 int next,to; 11 }a[50001]; 12 13 inline void add(int x,int y) { 14 a[++tot].to = y; 15 a[tot].next = head[x]; 16 head[x] = tot; 17 } 18 19 inline bool find(int x) { 20 for(int i = head[x];i; i = a[i].next) { 21 int u = a[i].to; 22 if(vis[u]) continue; 23 vis[u] = 1
; 24 if(p[u] == 0 || find(p[u])) { 25 p[u] = x; 26 return true; 27 } 28 } 29 return false; 30 } 31 32 int main() { 33 scanf("%d%d%d",&n,&m,&e); 34 for(int i = 1;i <= e; i++) { 35 int x,y; 36 scanf("%d%d",&x,&y);
37 add(x,y); 38 } 39 for(int i = 1;i <= n; i++) { 40 memset(vis,0,sizeof(vis)); 41 if(find(i)) ans++; 42 } 43 printf("%d",ans); 44 return 0; 45 }