zoukankan      html  css  js  c++  java
  • 【模板】匈牙利算法

     1 #include<cstring>
     2 #include<vector>
     3 #define MAX_V 80
     4 
     5 int V;                               //顶点数
     6 int match[MAX_V];          //所匹配的顶点
     7 bool used[MAX_V];         //DFS中用到 的访问标记
     8 vector<int> G[MAX_V];   //图的邻接表表示
     9 
    10 //向图中增加一条边接u和v的边
    11 void add_edge(int u,int v)
    12 {
    13     G[u].push_back(v);
    14     G[v].push_back(u);
    15 }
    16 
    17 //通过DFS寻找增广路
    18 bool dfs(int v)
    19 {
    20     used[v]=true;
    21 
    22     for(int i=0;i<G[v].size();i++)
    23     {
    24         int u=G[v][i],w=match[u];
    25         if(w<0||(!used[w]&&dfs(w)))
    26         {
    27             match[v]=u;
    28             match[u]=v;
    29             return true;
    30         }
    31     }
    32 
    33     return false;
    34 }
    35 
    36 //求解二分图的最大匹配
    37 int bipartite_matching()
    38 {
    39     int res=0;
    40 
    41     memset(match,-1,sizeof(match));
    42 
    43     for(int v=1;v<=V;v++)
    44     {
    45         if(match[v]<0)
    46         {
    47             memset(used,false,sizeof(used));
    48             if(dfs(v))
    49                 res++;
    50         }
    51     }
    52 
    53     return res;
    54 }
  • 相关阅读:
    重构该何时登场
    重构
    中国剩余定理
    连分数的应用
    连分数的性质
    有限连分数与欧几里德除法的联系
    连分数
    费马大定理
    P4178 Tree 点分治
    LOJ 6029. 「雅礼集训 2017 Day1」市场
  • 原文地址:https://www.cnblogs.com/lzj-0218/p/3566012.html
Copyright © 2011-2022 走看看