有条件的建议去油管上看,讲的很清楚https://www.youtube.com/watch?v=3roPs1Bvg1Q

引例:如果你是夏令营负责人,你的任务是将一群人分为两组。为了公平起见,每个人在卡片上写下了自己希望匹配的人,根据这些卡片,你要尽可能让希望彼此在一起的人更多。

1 基本概念

开花算法用于图中最大匹配的计算,为了方便理解我们给出几个概念:

1.1 匹配

若G=(V,E)是无向图,边集M属于E,M中任意两边均不相邻,M是G的匹配。下图黄色部分就是一个匹配。

1.2 渗透点

顶点v和M中边关联,则v为渗透点,否则为非渗透点。图中橙色即为非渗透点,也是在寻找最大路径要用到的。

1.3 交错路径

M是G的一个匹配,M的交错路径是匹配路径和非匹配路径交替构成,长度可以为1。白色路径为未匹配路径,黄色为匹配路径。

1.4 增广路径

增广路径是起点和终点都是非渗透点的交错路径。主要用于改进匹配。增广路径理论上来说应该比最短路径要短。

紫色部分是当前黄色匹配的增广路径。

增广路径顾名思义,可以通过切换匹配和不匹配的边来增加匹配的大小。如图所示,修改非匹配边后,匹配仍然有效,但是黄色路径增加1。

 1.5 Berge定理

M是G的最大匹配的充要条件是G不包含M增长路径。可以通过增广路经反复修改,直到没有增广路径,即找到最大的匹配。

2 树

下面我们介绍如何在树上进行开花算法:

初始匹配为空,所有节点都是非渗透点。随机选取一个非渗透点,进行BFS广度优先搜索,交替添加匹配和不匹配的边。

然后使用增广路径反复匹配,直到没有剩余路径即可。

3 图

我们先看一下开花算法不适用的情况,假设我们已经找到一个匹配,希望对其进行改进达到最大匹配。

但在这张图里增广路径比最短路径要长,所以无法实现

此处,增广路径分为开花(blossom)和茎(stem)。开花和茎如下图所示,茎是一个以非渗透节点结束的交替路径。

为了解决这个问题,当我们从茎进入花时,采用以下措施:

(1)把花收缩,变成渗透点

(2)在收缩图寻找增广路径

(3)增加匹配

(4)把路径变为原始图,即开花

上述步骤成立的条件是,图具有增广路径,收缩图也具有增广路径。

具体算法如下:

时间复杂度方面,朴素算法是,开花算法是

Blossom算法,开花算法简单理解相关推荐

  1. 人工智能:深度学习算法及应用——简单理解CNN卷积神经网络并python实现(带源码)

    深度学习算法及应用 一. 实验目的 二. 实验要求 三. 实验的硬件.软件平台 四. 实验原理 1.1. 深度学习概述 1.2. 深度学习的常见结构 1.3. 卷积神经网络(CNN) **卷积** * ...

  2. CPD配准算法及代码的简单理解(Coherent Point Drift)

    我的毕业设计用到了CPD算法,以及CPD代码工具包,当时刚开始接触CPD时在网上没找到几篇教程或是经验总结的东西.现在毕设做完了,就结合我的理解写一篇文章.可能写的会有点乱,因为我也是一时兴起想要做一 ...

  3. 协同过滤算法的简单理解《推荐系统实践》

    协同过滤算法的简单理解 本文主要是讲解一下<推荐系统实践>中UserCF和ItemCF这两种基于领域的推荐算法,写出自己的理解. UserCF(基于用户的协同过滤算法) 这种推荐算法的出发 ...

  4. 直观地简单理解Tarjan算法(寻找有向图中的强连通图)

    简单理解Tarjan算法   按照百度百科的播报应该是读成['ta:rdʒən]?看过了几篇网络上的解释虽然都讲得比较具体但刚开始都难以理解,所以打算写一个更直观的理解方式.   Tarjan算法是求 ...

  5. 开花算法_数据科学即将开花,但其根源已经存在了很长时间

    开花算法 "The future of data analysis can involve great progress, the overcoming of real difficulti ...

  6. 深度学习中7种最优化算法的可视化与理解

    作者丨小小鱼@知乎 来源丨https://zhuanlan.zhihu.com/p/41799394 本文旨在优化一维函数,实际上模型参数有数百万维以上,差距很大,因此本文最好作为辅助法的理解,而非对 ...

  7. 对算法的时间复杂度的理解

    "算法(algorithm)是为求解一个问题需要遵循的,被清楚地指定的简单指令集合." 算法设计时,很重要的一步需要确定其占用的空间资源和时间资源,如果一个算法执行需要很长的时间, ...

  8. 【数据结构】字符串 模式匹配算法的理解与实现 Brute Force算法(BF算法)与KMP算法 (C与C++分别实现)

    #笔记整理 若不了解串的定义,可至: 串(string)的定义与表示 查看 串的模式匹配算法 求子串位置的定位函数 Index(S, P, pos) 求子串的定位操作通常称作串的模式匹配(其中子串P称 ...

  9. Gillespie算法的Python简单实现(实例)

    Gillespie算法的Python简单实现(实例) 文章目录 Gillespie算法的Python简单实现(实例) 前言 一.Gillespie是什么? 二.题目 三.代码 1.引入库 2.类定义 ...

最新文章

  1. GitHub怎样fork别人代码到自己仓库并进行贡献
  2. c语言指针底层实现,C语言二级指针底层实现
  3. 用固定收敛标准网络的迭代次数比较两张图片的相似度
  4. 产品设计 | App功能设计的21条注意事项
  5. 为什么只推荐入主流版本华强北耳机?
  6. 技术要求→物理安全→防盗窃和防破坏
  7. 客户连接多个服务端_Linux 服务端最大并发数是多少?
  8. Windows IP测试小脚本
  9. TensorFlow 深度学习实战指南中文版
  10. 会议家用多面手!智能微型投影设备导购
  11. 【Ardunio】开发入门教程【二】数据类型
  12. kaldi在java中运行_Kaldi语音识别CVTE模型实战
  13. Pillow为图片添加水印
  14. 计算机基础——4.1 数字通信入门
  15. 教师资格综合素质知识要点记录
  16. 算法特训营第2周刷题题目
  17. ESP-MESH 无线组网,让智能家居通信更方便 | ESP32轻松学(Arduino版)
  18. CentOS 7 解决网络不可用问题
  19. 大数据_——利用hive仓库模拟数据进行日活、日新、留存数据的分析统计(详细代码步骤)
  20. 医学图像领域,是时候用视觉Transformer替代CNN了吗?

热门文章

  1. COM编程之三 QueryInterface
  2. 卫龙食品冲刺港股:上半年经调整利润超4亿 高瓴与红杉是股东
  3. Python编程练习-石头剪刀布
  4. python nodejs 爬虫_NodeJS爬虫入门
  5. 跳转页面时报错 java.lang.NumberFormatException: null
  6. JavaScript脚本语⾔基础语法笔记总结
  7. 常用linux环境配置大全
  8. Lua的函数参数为table时奇特现象
  9. 阿里云备案主体信息不一致
  10. 使用腾讯云创建二级域名并解析到云虚拟主机