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 }