zoukankan      html  css  js  c++  java
  • 二分图最大匹配之匈牙利算法

    二分图也是二部图,即可以将一个图分为两部分。

    用男女举例,男生与女生有暧昧关系,同性之间是不存在暧昧的(同性才是真爱,异性只为传宗接代),则他们之间存在一条边,那么我们可以将男生,女生分开,男生在左边,女生在右边

    我们可以发现在左边的男生是没有边相连的,右边的女生也是,他们只与对面的异性存在边,那么这就是一个二分图。

    至于匹配问题也很好理解,这里可以看成夫妻关系,一个男生可以有几个暧昧的异性,但是只有一位妻子,女生也是如此;一对夫妻即一组匹配

    那么在给出的一个二分图中,求最大匹配就是最多存在几对夫妻。

    求二分图最大匹配这里介绍匈牙利算法:

    强推这位博主讲的匈牙利 :https://blog.csdn.net/dark_scope/article/details/8880547

    给出一道洛谷的模板题:P3386 【模板】二分图匹配

    这里给出我的代码:

     1 /*
     2 二分图最大匹配模板
     3 czq
     4 */
     5 
     6 #include <cstdio>
     7 #include <cstring>
     8 #include <iostream>
     9 using namespace std;
    10 const int N = 1e3 + 10;
    11 
    12 int n, m, e;
    13 int edges[N][N];
    14 int vis[N], rec[N];
    15 //rec记录配对情况
    16 
    17 inline bool match(int now)
    18 {
    19     for(int i = 1; i <= m; i++)
    20     {
    21         if(edges[now][i] == 1 && vis[i] == 0)
    22         {
    23             vis[i] = 1;
    24             if(rec[i] == 0 || match(rec[i]))
    25             {
    26                 rec[i] = now;
    27                 return true;
    28             }
    29         }
    30     }
    31     return false;
    32 }
    33 
    34 int main()
    35 {
    36     memset(rec, 0, sizeof(rec));
    37     memset(edges, 0, sizeof(edges));
    38     cin >> n >> m >> e;
    39     for(int i = 1; i <= e; i++)
    40     {
    41         int u, v;
    42         cin >> u >> v;
    43         edges[u][v] = 1;
    44     }
    45 
    46     int ans = 0;
    47 
    48     for(int i = 1; i <= n; i++)
    49     {
    50         memset(vis, 0, sizeof(vis));
    51         if(match(i))    ans++;
    52     }
    53 
    54     cout << ans << endl;
    55 
    56     return 0;
    57 }
  • 相关阅读:
    typeof用法
    图片上传显示图片
    用Express 创建项目
    Express中使用session
    生成一个node项目
    async同步异步
    async异步流程控制
    nodejs并行无关联
    nodejs串行有关联
    nodejs串行无关联
  • 原文地址:https://www.cnblogs.com/nonameless/p/11762547.html
Copyright © 2011-2022 走看看