1. 程式人生 > >二分圖的最大匹配【匈牙利算法】

二分圖的最大匹配【匈牙利算法】

ring define 分享圖片 簡單 main clu ext 最大 closed

很早之前就寫過了二分圖, 這個算法也屬於很簡單的。

然而在題目裏一般不會那麽明顯的看出是二分圖匹配問題,並且二分匹配會與其他算法配合, 只是成為代碼中的一小部分。

在這裏寫上模板。

題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=2063

技術分享圖片
 1 #include<stdio.h>
 2 #include<string.h>
 3 #define mem(a, b) memset(a, b, sizeof(a))
 4 
 5 int head[510], cnt;
 6 int k, m, n; //k為組合數,m為女生人數,n為男生人數 
7 int used[510], master[510]; 8 9 struct Edge 10 { 11 int to, next; 12 }edge[1010]; 13 14 void add(int a, int b) 15 { 16 edge[++ cnt].to = b; 17 edge[cnt].next = head[a]; 18 head[a] = cnt; 19 } 20 21 int find(int x) 22 { 23 for(int i = head[x]; i != -1; i = edge[i].next)
24 { 25 int to = edge[i].to; 26 if(used[to] == -1) 27 { 28 used[to] = 1; 29 if(master[to] == -1 || find(master[to])) 30 { 31 master[to] = x; 32 return 1; 33 } 34 } 35 }
36 return 0; 37 } 38 39 int main() 40 { 41 int ans; 42 while(scanf("%d", &k)!=EOF) 43 { 44 if(k == 0) 45 break; 46 cnt = ans = 0; 47 mem(head, -1), mem(master, -1); 48 scanf("%d%d", &m, &n); 49 for(int i = 1; i <= k; i ++) 50 { 51 int a, b; 52 scanf("%d%d", &a, &b); 53 add(a, b); 54 } 55 for(int i = 1; i <= m; i ++) 56 { 57 mem(used, -1); 58 if(find(i)) 59 ans ++; 60 } 61 printf("%d\n", ans); 62 } 63 return 0; 64 }
View Code

二分圖的最大匹配【匈牙利算法】