1 /*==================================================*\
2 | 二分图匹配(匈牙利算法BFS 实现)
3 | INIT: g[][]邻接矩阵;
4 | CALL: res = MaxMatch (); Nx, Ny 初始化!!!
5 | 优点:适用于稀疏二分图,边较少,增广路较短。
6 | 匈牙利算法的理论复杂度是O(VE)
7 \*==================================================*/
8 const int MAXN = 1000;
9 int g[MAXN][MAXN], Mx[MAXN], My[MAXN], Nx, Ny;
10 int chk[MAXN], Q[MAXN], prev[MAXN];
11 int MaxMatch(void) {
12 int res = 0;
13 int qs, qe;
14 memset(Mx, -1, sizeof(Mx));
15 memset(My, -1, sizeof(My));
16 memset(chk, -1, sizeof(chk));
17 for (int i = 0; i < Nx; i++) {
18 if (Mx[i] == -1) {//对于x集合中的每个没有匹配的点i进行一次bfs找交错轨
19 qs = qe = 0;
20 Q[qe++] = i;
21 prev[i] = -1;
22
23 bool flag = 0;//判断是否找到
24 while (qs < qe && !flag) {
25 int u = Q[qs];
26 for (int v = 0; v < Ny && !flag; v++)
27 if (g[u][v]//如果u和v相连
28 && chk[v] != i)//并且v没有被u check过
29 {
30 chk[v] = i;
31 Q[qe++] = My[v];//放进
32 if (My[v] >= 0)//如果v和其他的相连,则修改之
33 prev[My[v]] = u;
34 else {//直到找到一个u和v都没有用过的
35 flag = 1;
36 int d = u, e = v;
37 while (d != -1) {//确保回到最初
38 int t = Mx[d];
39 Mx[d] = e;
40 My[e] = d;
41 d = prev[d];
42 e = t;
43 }
44 }
45 }
46 qs++;
47 }
48 if (Mx[i] != -1)
49 res++;
50 }
51 }
52 return res;
53 }