洛谷模板题

学了匈牙利算法。

匈牙利算法核心是找增广路经。

可以求出二分图的最大匹配数。

感觉还是挺好理解的。

时间复杂度  邻接矩阵:【模板】二分图匹配   邻接表:【模板】二分图匹配

空间复杂度  邻接矩阵:【模板】二分图匹配   邻接表:

看的这个blog,有些恶趣味。(受不了凤姐那张图。。)

——代码

 1 #include <cstdio>
 2 #include <cstring>
 3 
 4 using namespace std;
 5 
 6 int n, m, k, cp, cnt;
 7 int girl[10010], to[1000001], next[1000001], head[10010];
 8 //girl[i]记录第i个girl所属的boy 
 9 bool dog[10010];
10 //dog[i]记录i是否脱单 
11 
12 inline void add(int x, int y)
13 {
14     to[cnt] = y;
15     next[cnt] = head[x];
16     head[x] = cnt++;
17 }
18 
19 int find_girl(int u)
20 {
21     int i, v;
22     for(i = head[u]; i != -1; i = next[i])//找所有有好感的对象 
23     {
24         v = to[i];
25         if(!dog[v])
26         //单身(这里标记的意思是这次查找曾试图改变过该妹子的归属问题,但是没有成功,所以就不用瞎费工夫了)
27         {
28             dog[v] = 1;
29             if(!girl[v] || find_girl(girl[v]))//名花无主或者能腾出个位置来
30             {
31                 girl[v] = u;
32                 return 1;
33             }
34         }
35     }
36     return 0;
37 }
38 
39 int main()
40 {
41     int i, j, x, y;
42     scanf("%d %d %d", &n, &m, &k);
43     memset(head, -1, sizeof(head));
44     for(i = 1; i <= k; i++)
45     {
46         scanf("%d %d", &x, &y);
47         if(x > n || y > m) continue;
48         add(x, y);//有暧昧关系 
49     }
50     for(i = 1; i <= n; i++)
51     {
52         memset(dog, 0, sizeof(dog));
53         if(find_girl(i)) cp++;
54     }
55     printf("%d", cp);
56     return 0;
57 }
View Code

相关文章: