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

很早之前就写过了二分图, 这个算法也属于很简单的。

然而在题目里一般不会那么明显的看出是二分图匹配问题,并且二分匹配会与其他算法配合, 只是成为代码中的一小部分。

在这里写上模板。

题目链接: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

猜你喜欢

转载自www.cnblogs.com/yuanweidao/p/10805461.html
今日推荐