• 二分图匹配匈牙利算法BFS实现


     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  }
  • 相关阅读:
    Java实现 LeetCode 92 反转链表 II
    Java实现 LeetCode 92 反转链表 II
    Java实现 LeetCode 91 解码方法
    Java实现 LeetCode 91 解码方法
    Java实现 LeetCode 91 解码方法
    CDialogBar(对话条)和CReBar(伸缩条)的编程
    WinSock
    WinSock
    静态文本显示图标图片
    拆分窗口
  • 原文地址:https://www.cnblogs.com/kakamilan/p/2590879.html
Copyright © 2020-2023  润新知