算法简介

算法简介

二分图最大匹配

相关概念

  • 二分图:如果一个图的所有顶点可以被分为X和Y两个集合,并且所有边的两个顶点恰好一个属于集合X,另一个属于集合Y,即每个集合内的顶点没有边相连,那么此图就是二分图.
  • 无权二分图:没有权重
  • 待权权二分图:有边权

相关算法

1. 无权二分图最大匹配----匈牙利算法

* 时间复杂度:

用邻接表存储:O(NM)

* 算法特点:
  1. 首先从任意一个未被配对的点u开始,从点u的边中任意选一条边(假设这条边是u→ν)开始配对,如果此时点v还没有被配对,则配对成功.此时便找到了一条增广路(只不过这条增广路比较简单).
    如果此时点v已经被配对了,那就要尝试进行"连锁反应".如果尝试成功了,则找到一条增广路,此时需要更新原来的配对关系.这里要用一个数组match来记录配对关系,比如点v与点配对了,就记作match[v]=u和match[u]=v配对成功后,记得要将配对数加1.
    配对的过程我们可以通过深度优先搜索来实现,当然广度优先搜索也可以.
  2. 如果刚才所选的边配对失败,要从点u的边中再重新选一条边,进行尝试.直到点u配对成功,或者尝试过点u所有的边为止.
  3. 接下来继续对剩下没有被配对的点一一进行配对,直到所有的点都尝试完毕,找不到新的增广路为止,输出配对数.
* 代码示例

无权二分图最大匹配–匈牙利算法

2. 带权二分图最佳完美匹配—KM算法

这里强烈建议参考这位大神的博文:KM算法,
上面博文详细画图推演了算法流程.本文在上面基础上将图邻接矩阵存储法改为邻接表存储法,进一步降低了时间复杂度

* 时间复杂度:
  1. 邻接矩阵存储:O(N^3),N为点的总数
  2. 邻接表存储:O(M*N^2),M为边数,N为点的总数
* 算法特点
  1. 首先将X中每个成员的期望初始化为它所有边权的最大值,Y的期望为0,假设X集合选择x1,Y集合选择y1,期望记录为exx[x1],exy[y1].
  2. 为X中每个成员(此时为x1)尝试匹配,注意X和Y集合中的每个成员本轮只能匹配一次.
    若匹配成功,则进行X集合下一个成员尝试,若匹配失败,则需要调整期望,直到本次匹配成功为止.
  3. 本轮匹配规则(x1匹配)为:gap = exx[x1] + exy[y1] - w(x1-y1),w表示x1到y1的边权.
    若gap==0,表示满足期望要求,记录匹配结果:match[y1] = x1;
    反之,则不满足要求,则需要计算slack,规则:在本轮中y1的所有值选择最小值.即:slack[y1]=std::min(slack[y1],gap),本轮尝试失败,执行4.
  4. 计算slack中最小值规则:任意一个参与匹配的X中成员能换到任意一个这轮没有被选择过的Y中成员所需要降低的最小值.
    即:在所有slack[y1],slack[y2]…中选择最小的slack,这里记为d,
    为本轮参与的X集合对象降低期望:exx[x1]-=d,为本轮被选择的Y集合对象增加期望:exy[y1]+=d,没有被选择的Y集合对象更新slack[y2]-=d.然后再次匹配尝试,直到本次成功为止.
* 代码示例

带权二分图最佳完美匹配—KM算法

算法简介:二分图最大匹配相关推荐

  1. 51nod 2006 飞行员配对(二分图最大匹配) 裸匈牙利算法 求二分图最大匹配题

    题目: 题目已经说了是最大二分匹配题, 查了一下最大二分匹配题有两种解法, 匈牙利算法和网络流. 看了一下觉得匈牙利算法更好理解, 然后我照着小红书模板打了一遍就过了. 匈牙利算法:先试着把没用过的左 ...

  2. HDU - 2389 Rain on your Parade(Hopcroft-Krap算法求二分图最大匹配)

    题目链接:点击查看 题目大意:给出n个人和m个雨伞,t分钟后就要下雨了,现在给出每个人的坐标和速度,以及雨伞所在的坐标,每个雨伞只能容纳一个人,题目问最多有多少个人能不被淋到 题目分析:二分图最大匹配 ...

  3. 匈牙利算法 求二分图最大匹配

    匈牙利算法 1. 二分图 二分图: 又称作二部图,是图论中一种特殊模型.设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中每条边所关联的两个顶点 i 和 j 分别属 ...

  4. 匈牙利算法求解二分图最大匹配问题

    这是一个非常简单的问题,描述如下,给你两部分的点,问你最大匹配数是多少. 简单描述一下算法流程,首先我们先匹配左边,蓝1先匹配红2:接下来到蓝2,只能匹配红2,但是这这时候发现红2已经有主了,根据匈牙 ...

  5. 【7.17总结】 匈牙利算法(二分图最大匹配)

    二分图就是把图的点集分成X和Y两个集合且连接每条边的两个顶点分别在两个集合. 匹配是指图的边集的一个子集,其中任意两条边没有相同的顶点. 最大匹配就是找到一个匹配使得匹配里面的边数最多. 增广路径就是 ...

  6. Hungary(匈牙利算法)——二分图最大匹配

    在复习匈牙利算法的时候,发现这么一篇介绍匈牙利算法的文章,非常通俗易懂,所以就借鉴过来了. 复杂度:邻接矩阵:O(v^3)邻接表:O(V*E) 附上链接:趣写算法系列之--匈牙利算法 下面就附上代码吧 ...

  7. 算法题 匈牙利算法 求二分图最大匹配(Python)

    题目: 给定一个二分图,其中左半部包含n1n1个点(编号1~n1n1),右半部包含n2n2个点(编号1~n2n2),二分图共包含m条边. 数据保证任意一条边的两个端点都不可能在同一部分中. 请你求出二 ...

  8. python最长匹配_二分图最大匹配:匈牙利算法的python实现

    二分图匹配是很常见的算法问题,一般用匈牙利算法解决二分图最大匹配问题,但是目前网上绝大多数都是C/C++实现版本,没有python版本,于是就用python实现了一下深度优先的匈牙利算法,本文使用的是 ...

  9. 二分图最大匹配(匈牙利算法)

    二分图的匹配:给定一个二分图G,在G中的一个子图M中,M的边集{E}中的任意两条边都不依附于同一个顶点,则称M是一个匹配. 二分图的最大匹配:所有匹配中包含边数最多的一组匹配被称为二分图的最大匹配,其 ...

最新文章

  1. opencv中image watch插件安装与使用教程
  2. 【全网之最】最短代码清除数组中的假、空值(0、空、null、undefined、false)
  3. 如何采集Nginx的日志?
  4. fzu - 1752 Problem 1752 A^B mod C
  5. linux中fork和exec
  6. python中*args和**args的不同
  7. mysql数据到导入导出
  8. [POJ1469 COURSES]
  9. SDUT OJ 3403 数据结构实验之排序六:希尔排序
  10. 嵩天python测验_北理 嵩天老师 Python程序设计 测验易错题总结
  11. C#RSACryptoServiceProvider加密
  12. 6大常见家谱样本,尤其第4个,深受各大名门望族的喜爱!
  13. 【java】临时文件
  14. Mysql部署 MySQL ERROR 1698 (28000) 错误
  15. 机器学习OneR算法
  16. C程序中各个段的含义
  17. oracle安装实训心得,oracle实训总结
  18. #今日论文推荐# IJCAI2022 | 求同存异:多行为推荐的自监督图神经网络
  19. Chrome浏览器自带截长图功能,只需两个快捷键!
  20. ios 判断应该用pop返回还是dismis返回

热门文章

  1. js实现评分功能---打星(包含半星)
  2. 实现android多页面跳转,获取数据操作
  3. 正则表达式给内容快速加双引号,单引号
  4. Appium安装环境配置教程
  5. Python+appium安装和演示
  6. java连接Access数据库的简单介绍
  7. MPI(OpenMPI和MPICH(IntelMPI、MVAPICH))和OpenMP
  8. 白天定时晚上提醒的软件有没有?
  9. java项目横向越权_横向越权、纵向越权问题解决
  10. 安装cuda版本的dgl库