• KM匹配模板


     1 int G[N][N];
     2 int lx[N], ly[N];
     3 int slack[N];
     4 int match[N];
     5 bool visitx[N], visity[N];
     6 int n;
     7 
     8 bool Hungary(int u)
     9 {
    10     visitx[u] = true;
    11     for(int i = 0; i < n; ++i)
    12     {
    13         if(visity[i])
    14             continue;
    15         else
    16         {
    17             if(lx[u] + ly[i] == G[u][i])
    18             {
    19                 visity[i] = true;
    20                 if(match[i] == -1 || Hungary(match[i]))
    21                 {
    22                     match[i] = u;
    23                     return true;
    24                 }
    25             }
    26             else
    27                 slack[i] = min(slack[i], lx[u] + ly[i] - G[u][i]);
    28         }
    29     }
    30     return false;
    31 }
    32 
    33 void KM_perfect_match()
    34 {
    35     int temp;
    36     memset(match, -1, sizeof(match));
    37     memset(lx, 0, sizeof(lx));
    38     memset(ly, 0, sizeof(ly));
    39     for(int i = 0; i < n; ++i)
    40         for(int j = 0; j < n; ++j)
    41             lx[i] = max(lx[i], G[i][j]);
    42     for(int i = 0; i < n; ++i)
    43     {
    44         for(int j = 0; j < n; ++j)
    45                 slack[j] = INT_MAX;
    46         while(1)
    47         {            
    48             memset(visitx, false, sizeof(visitx));
    49             memset(visity, false, sizeof(visity));
    50             if(Hungary(i))
    51                 break;
    52             else
    53             {
    54                 temp = INT_MAX;
    55                 for(int j = 0; j < n; ++j)
    56                     if(!visity[j])
    57                         temp = min(temp, slack[j]);
    58                 for(int j = 0; j < n; ++j)
    59                 {
    60                     if(visitx[j])
    61                         lx[j] -= temp;
    62                     if(visity[j])
    63                         ly[j] += temp;
    64                     else
    65                         slack[j] -= temp;
    66                 }
    67             }
    68         }
    69     }
    70 }
    View Code
  • 相关阅读:
    模拟赛2020.9.11
    棋盘(dfs)
    树的重心
    模拟赛9.4
    最大数(线段树)
    [模板] 线段树
    [模板][数据结构] 树状数组
    [AHOI2018初中组][二分查找] 分组
    [模板] Kruskal 求最小生成树
    [模板] 最近公共祖先(LCA)的几种求法
  • 原文地址:https://www.cnblogs.com/usedrosee/p/4678803.html
Copyright © 2020-2023  润新知