很早之前就写过了二分图, 这个算法也属于很简单的。
然而在题目里一般不会那么明显的看出是二分图匹配问题,并且二分匹配会与其他算法配合, 只是成为代码中的一小部分。
在这里写上模板。
题目链接: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 }