【学习笔记】一般图最大匹配
带花树算法
带花树?错了,是开花算法(Blossom Algorithm\text{Blossom Algorithm}Blossom Algorithm)。
在维基百科上有漂亮的图片。OI-wiki\text{OI-wiki}OI-wiki 中也是使用的这些图片。
在 CF\rm CFCF 的帖子里有很好的叙述,可供参考。
称邻边都未匹配的点为 exposed\rm exposedexposed,裸露的。首先,最大匹配等价于图中没有增广路,其中增广路是两个端点都 exposed\rm exposedexposed 且路径上的边的匹配情况交错。并且增广不会让之前不能增广的裸露点变得可增广,否则两条增广路的对称差(的俩连通块之一)是原本就可行的增广路。
因此我们可以从每个裸露点开始,找增广路。走增广路过程中走出的奇环被称作花(blossom\text{blossom}blossom)。花上没有裸露点,且仅有一个点的两条环上邻边都未匹配,称为花心。那么所有经过花的增广路必然经过花心。而且,花心到花上点有两种走法,必有其中之一能使得路径交错。因此花可以被 contract\rm contractcontract 。
缩 blossom\rm blossomblossom 会嵌套;没有花时,图是二部图,增广路可以求解。
难点大概在于,怎样得到原图上的增广路。精细实现的复杂度应该可以做到 O(n3)\mathcal O(n^3)O(n3),但因为我没实现过,所以我也不清楚。
线性代数做法
可见 CF\rm CFCF 帖子的评论区,和 201720172017 年论文《基于线性代数的一般图匹配》。引入 Tutte\text{Tutte}Tutte 矩阵 A~(G)\tilde A(G)A~(G) 满足
A~i,j={xi,jei,j(i<j)0(i=j)−xj,iej,i(j<i)\tilde A_{i,j}=\begin{cases} x_{i,j}e_{i,j} &(i<j)\\ 0 &(i=j)\\ -x_{j,i}e_{j,i} &(j<i) \end{cases} A~i,j=⎩⎨⎧xi,jei,j0−xj,iej,i(i<j)(i=j)(j<i)
其中 ei,je_{i,j}ei,j 表示 i,ji,ji,j 之间是否有连边,而 xi,jx_{i,j}xi,j 是形式变元。
动机是 detA~≠0\det\tilde A\ne 0detA~=0 足以说明图中有完美匹配。因为行列式的定义相当于作环覆盖,存在奇环时,将环反向可以使值抵消;不存在奇环时,可以构造出匹配。
判定 detA~≠0\det\tilde A\ne 0detA~=0 利用随机化赋值,根据 Schwartz–Zippel\text{Schwartz–Zippel}Schwartz–Zippel 引理,错误的概率不超过 degdetA~p=O(np){\deg\det\tilde A\over p}=\mathcal O({n\over p})pdegdetA~=O(pn) 可以接受,其中 Fp\mathbb{F}_pFp 为随机范围。
考虑最大匹配。只需找出列 rank\rm rankrank,因为这些位置构成的主子式非零(别忘了 A~\tilde AA~ 是 斜对称 的)。所以,求最大匹配的值,已经有了 O(nω)\mathcal O(n^\omega)O(nω) 的做法。
Comment. 其中 O(nω)\mathcal O(n^\omega)O(nω) 表示矩阵乘法 /// 消元的复杂度。
Remark. 消元可以和矩阵乘法做到相同复杂度,但不是高斯消元。而且具体实现我也不会,据称巨复杂。所以我们也可以不管它
【学习笔记】一般图最大匹配相关推荐
- pyecharts查看版本_pyecharts v1 版本 学习笔记 折线图,面积图
折线图 折线图 基本demo import pyecharts.options as opts from pyecharts.charts import Line c = ( Line() .add_ ...
- 【图神经网络】图神经网络(GNN)学习笔记:图分类
图神经网络GNN学习笔记:图分类 1. 基于全局池化的图分类 2. 基于层次化池化的图分类 2.1 基于图坍缩的池化机制 1 图坍缩 2 DIFFPOOL 3. EigenPooling 2.2 基于 ...
- 【图神经网络】图神经网络(GNN)学习笔记:图的基础理论
图神经网络GNN学习笔记:图的基础理论 1. 图的概述 2.图的基本类型 2.1 有向图和无向图 2.2 非加权图与加权图 2.3 连通图与非连通图 2.4 二部图 2.5 邻居和度 2.6 子图和路 ...
- 激光slam学习笔记——基于图优化的激光slam方法
激光slam学习笔记--基于图优化的激光slam方法 1.slam基础 整体来说,在激光slam中,滤波器的误差要小于图优化的误差. 图优化通俗点说就是里程计计算的位姿与观测到的位姿之间会形成一个误差 ...
- Windows phone 8 学习笔记(5) 图块与通知
基于metro风格的Windows phone 8 应用提到了图块的概念,它就是指启动菜单中的快速启动图标.一般一个应用必须有一个默认图块,还可以有若干个次要图块.另外,通知与图块的关系比较密切,我们 ...
- redis学习笔记导图
自己在学习redis过程中总结的思维导图 欢迎大家一起沟通学习 面试redis背这张图基本够了,包含了所有的知识点
- 知识图谱学习笔记-图操作
一.自定义图 import org.apache.spark.{SparkConf, SparkContext} import org.apache.spark.graphx.{Edge, Verte ...
- 【算法学习笔记】 图(四)用优先级队列优化Dijkstra算法求最短路径(邻接矩阵存储)
优先级队列:priority_queue,经过实验之后发现默认是首先输出最大的元素,现在想让队头为最小的元素,需要进行运算符重载 此算法寻找源点到与它连接的所有顶点的最短路径 运算符重载: struc ...
- 分别用邻接矩阵和邻接表实现图的深度优先遍历和广度优先遍历_数据结构与算法学习笔记:图...
图: 图结构区别于线性结构和树型结构,区别可见下图 逻辑上的图(graph)结构由顶点(vertex)和边(edge)组成. 一个图结构G包含顶点集合V和边集合E,任何两个顶点之间可以有一个边表示两者 ...
- 集成电路版图学习笔记1----版图基本知识
集成电路设计流程: Created with Raphaël 2.1.2设 计 方 案定 义 结 构 功能设计与仿真电路设计与仿真版图设计与仿真后 仿 真 流片与芯片测试大 规 模 生 产 由上图版图 ...
最新文章
- DL之VGGNet:VGGNet算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
- DB2中ixf文件的导入导出
- Leetcode--90. 子集Ⅱ
- 深度干货|云原生分布式数据库 PolarDB-X 的技术演进
- 1835 魔法猪学院
- 云小课 | MRS基础入门之HDFS组件介绍
- gcc编译ceres-solver报错‘is_trivially_default_constructible’ is not a member of ‘std’
- 在spring-boot中使用@ConfigurationProperties
- 使用sysbench 0.5 对mysql 进行性能、压力测试
- oracle系统常见错误(摘自文平书)
- 免费的Bootstrap管理后台模板集合
- 每月一书(202104):《浪潮之巅》
- Woodbury矩阵恒等式介绍
- 视频编码之I,P,B帧
- html防止浏览器表单自动填充,禁止浏览器input表单自动填充
- 2017年Gartner的数据防泄漏(DLP)魔力象限(Magic Quadrant)
- 【公告】博客新皮肤上线啦
- sofa-bolt是什么?
- 异常值 识别与处理方法
- python携程asyncio_python 携程asyncio 实现高并发示例2
热门文章
- md5工具查看两个文件是否一致
- word排版图片的一种方法
- 严重性 代码 说明 项目 文件 行 禁止显示状态错误 MSB4030 “是(/ZW)”对于“CL”任务的“CompileAsWinRT”参数是无效值。“CompileAsWinRT”参数的类型为“S
- SharePoint 轻量化应用之HR招聘系统之入职通知界面构建
- Revit二次开发——读取CAD文字实现更新模型的思路
- 编程语言Java 扫描识别条形码图片
- [yolov5] yolo的数据标签格式
- 客户端异常断网断电,服务端该如何感知?
- 算法 柠檬水找零(贪心算法)
- Web网页实现登录验证码功能