首页 > 其他分享 >2023-04-11 无向图的匹配问题

2023-04-11 无向图的匹配问题

时间:2023-04-11 23:25:31浏览次数:51  
标签:11 二分 匹配 04 增广 路径 算法 无向 左侧

无向图的匹配问题

之所以把无向图的这个匹配问题放到最后讲是因为匹配问题借鉴了有向图中一些算法的思想

1 最大匹配和完美匹配

二分图回顾

二分图:把一个图中的所有顶点分成两部分,如果每条边的两端分别属于不同部分,则这个图是二分图。更多二分图内容参考第4章 二分图相关

最大匹配和完全匹配的概念

  • 一旦在二分图中找到一条边是我们想要的匹配,那么这两个点在下面的匹配就不能再被访问了(类似相亲时两个人看对眼了,其他相亲的就不能掺和了)。
  • 在二分图中像上面那样的匹配最多有多少对就是最大匹配问题(类似一堆人去相亲,最多能成多少对)
  • 如果所有顶点都找到了自己的匹配,那么这个最大匹配就成了完全匹配(即一堆人去相亲,每个人在不干涉其他成功牵手的情侣前提下,都找到了自己心仪的对象)

    完全匹配一定是最大匹配,但是最大匹配不一定是完全匹配。
    匹配问题与二分图

2 无向图的最大匹配问题转化为有向图的最大流问题

所有边的容量都为1,最大流即为最大匹配数
无向图的最大匹配问题转化为有向图的最大流问题

3 实现二分图匹配算法

4 LeetCode LCP4.覆盖

题目分析

可以用黑白两种颜色覆盖栅格,两种颜色的格子可以看做二分图,则问题可以转换为二分图的最大匹配问题
转换为二分图问题

黑白块的坐标规律

坐标规律

代码实现

5 匈牙利算法:不借助有向图和网络流模型求解最大匹配问题

匈牙利算法的定义

下面的增广路径是指首尾都是非匹配点的路径,和上一章残量图中的增广路径不同
匈牙利算法总结

  • 1.在二分图中
  • 2.从左侧的一个非匹配点出发
  • 3.从右向左的边,永远走匹配边
  • 4.匹配边和非匹配边交替出现(称为交替路)
  • 5.终止与另外一个非匹配点(即增广路径首尾都是非匹配点)

    交替路和增广路径的区别:增广路径是起始点都是非匹配点的交替路。增广路径一定是交替路,但交替路不一定是增广路径

  • 6.有增广路径,意味着最大匹配数可以加1
  • 7.遍历完左侧所有尚未匹配的点,即找到最大匹配

总结:匈牙利算法就是对二分图左侧每个尚未匹配的点,不断地寻找可以增广的交替路的过程。

可以用前面的BFS来实现,不同的是来到二分图的右侧的点不需要寻路,代码中的那个队列只存储左边的顶点。

匈牙利算法距离模拟

  • 以下图为例.匹配即配对,相当于相亲中的一对人,一旦看对眼,别人就不能插足了
  • 每次匹配起始都是左侧->右侧。
  • 匈牙利算法的核心:对每条增广路径上顶点的匹配状态取反(非匹配边变匹配边,匹配边变非匹配边),则可以多得到一条匹配边,直到找到所有的匹配边。

匈牙利算法举例

  • 1.先把左侧的0开始,把0-4匹配到一起(匹配顶点标为蓝色代表已访问,匹配顶点之间的边标为红色)
  • 2.第1次找增广路径:
    • 再从左侧的1开始,访问到右侧的邻接点4
    • 4已经被访问,向左侧走4的匹配边4-0
    • 0仍然已经被访问,再向右侧访问0的邻接点即6
    • 6还未被匹配,所以找到增广路径1-4-0-6

    第1次找增广路径

  • 3.第1次用匈牙利算法:对增广路径1-4-0-6匹配状态取反,即1-4变为一对匹配、0-6变成一对匹配。

    匈牙利算法第1次应用

  • 4.第2次找增广路径:
    • 再从左侧的2开始,先访问到邻接点6
    • 6已经被访问,向左走6的匹配变6-0
    • 0为左侧的顶点,所以0继续向右遍历0的邻接点4
    • 4已经被访问,向左走4的匹配4-1,
    • 1在左侧,需要继续向右访问1的邻接点7
    • 7还未被访问,所以我们找到第2条增广路径2-6-0-4-1-7

    第2次找到增广路径

  • 5.第2次用匈牙利算法:对增广路径2-6-0-4-1-7匹配状态取反,即2-6变为一对匹配、0-4变成一对匹配、1-7变成一对匹配

    匈牙利算法第2次应用

  • 6.第3次找增广路径:从左侧顶点3出发,向右找3的邻接点5,5未被访问,3-5就是一条增广路径
  • 7.第3次用匈牙利算法:把3-5的匹配状态取反,则3-5变成一对匹配边。

    匈牙利算法第3次应用

  • 8.至此所有的顶点都已被访问,找到最大匹配完成(即2-6变为一对匹配、0-4变成一对匹配、1-7变成一对匹配、3-5变成一对匹配,一共4对匹配)

起始点从左侧的其他店开始,结果是一样地,自己可以模拟下

6 匈牙利算法(Hungarian[hʌŋˈɡeriən])的BFS实现

7 匈牙利算法(Hungarian[hʌŋˈɡeriən])的DFS实现

标签:11,二分,匹配,04,增广,路径,算法,无向,左侧
From: https://www.cnblogs.com/lsgwr/p/17308237.html

相关文章

  • 每日总结 4.11
    今天进行了虚拟售卖机的页面规划和数据更新。学习了页面视频的实现,为之后的广告做准备。实现了两个虚拟售卖机的购买:  <%@pagelanguage="java"contentType="text/html;charset=UTF-8"pageEncoding="UTF-8"%><%@pageimport="toolse.Tll"%><%@pageimpor......
  • 2023.4.11——团队任务日报
    认领的工作任务:工作任务预估时间1.角色管理—教师身份(6.5h)2.调用接口,调用摄像头实现人脸识别(4h) ......
  • 4月11日leetcode练习
    设计一个支持push,pop,top操作,并能在常数时间内检索到最小元素的栈。实现MinStack类:MinStack()初始化堆栈对象。voidpush(intval)将元素val推入堆栈。voidpop()删除堆栈顶部的元素。inttop()获取堆栈顶部的元素。intgetMin()获取堆栈中的最小元素。 来源:力扣(Le......
  • 二分查找 (easy 704. 二分查找)
    虽然也刷了一些题了,但是没有总结,这样效率不高.之后刷题都写一下总结.LeetCode上的标记:红色不通过紫色有待优化绿色达到期望(easy704.二分查找)......
  • 4.11号今日总结
    今日我们团队录制了服创团队第一次团队会议的视频,时常为39分钟.在这次会议中我们主要讨论了已经完成的一些功能以及后期需要实现的一些功能,我们四人团队积极发表了自己的想法,认领了各自的任务以及定制了每天需要实现的进度目标.......
  • Lab03-04
    目录样本信息字符串信息导入表信息样本分析样本运行时检查运行条件:查杀思路总结技巧样本信息字符串信息导入表信息样本分析样本运行时检查运行条件:命令行参数个数是否大于1如果参数等于1,检查注册表:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\XPS\Configuration如......
  • java学习日记20230410-List
    List接口基本介绍List集合类中元素有序,即添加顺序和取出顺序一致,且可重复;List集合中的每隔元素都有其对应的顺序索引,即支持索引List容器中的元素都对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素JDKAPI中List接口的实现类有:ArrayListLinkedListVe......
  • 11-键盘录入笔记
    一,键盘录入涉及到的方法如下:​ next()、nextLine()、nextInt()、nextDouble()。1)next()、nextLine():可以接受任意数据,但是都会返回一个字符串。比如:键盘录入abc,那么会把abc看做字符串返回。​ 键盘录入123,那么会把123看做字符串返回。代码示例:Scannersc=newScanner(System.in);......
  • C++/ 4/11 学习内容
    空指针调用结构体中的成员函数const修饰成员函数,不能更改函数成员的值友元,让朋友可以访问本类的私有变量, *全局函数做友元*类做友元*成员函数做友元运算符重载:注意格式就ok还有<<这个输出时候的重载, 各种个样的函数重载,主要是为了方便,在主函数里面的实现......
  • Javaweb-登录界面-filter配合案例-2023-04-11
    1、新建login.jsp登录界面响应的路径<%@pagecontentType="text/html;charset=UTF-8"language="java"%><html><head><title>Login</title></head><body><h1>登录界面</h1><hr><form......