带花树略解

Another Blog

带花树是一种用于解决一般图最大匹配的算法,利用了匈牙利算法的思想。

前置知识

  • 匈牙利算法
  • BFS 树
  • 并查集

定义

  • 奇环/偶环:长度为奇数/偶数的环。
  • 花(blossom):在 BFS 过程中,遍历到的边与 BFS 树边构成的奇环;
  • 柄(stem):从 BFS 树根到奇环中深度最浅的点的路径;
  • 蒂(tip):奇环中在柄上的那个点。

带花树略解_第1张图片

算法思路

首先我们考虑匈牙利算法在 BFS 时如何工作:

当我们搜索到点 u u u,对于边 ( u , v ) (u,v) (u,v)

  • 如果 v v v 没有被匹配,证明我们得到了一条增广路径;
    • 此时我们将增广路径上的每条边翻转,并结束 BFS;
  • 如果 v v v 不在树中,继续 BFS;
  • 如果 v v v 在树中,并且 ( u , v ) (u,v) (u,v) 使图中出现偶环,忽略它;
  • v v v 在树中,并且 ( u , v ) (u,v) (u,v) 使图中出现奇环”(即图中出现了花)是不可能的,因为这是二分图。

故我们只需着重考虑如何处理奇环。

当我们发现一朵花时,我们将整朵花缩为一个新的节点,并且继续 BFS。

带花树略解_第2张图片带花树略解_第3张图片

当我们在缩花后的图中寻找到一条增广路时,我们将花重新展开。显然花蒂连接的两条花上的边一定是未被匹配的,剩下的边一定是匹配与未匹配交替出现,于是不论我们在增广路上,花所连接的边接在哪个点上,我们总能在花蒂沿花到这个点的两个方向的路径中选在出一个,使得展开后增广路仍然是匹配与未匹配交替出现。

带花树略解_第4张图片
带花树略解_第5张图片
带花树略解_第6张图片

实现

具体实现时,并不需要真正地将花缩为一个点再展开。我们用并查集来模拟把花合并为一个节点,对于每个节点,维护一个 next 值代表我们展开花后,从花上的哪个方向走到花蒂处(next 类似于一个双向链表)

(待补)

代码

(待补)

你可能感兴趣的:(笔记,#,图论-带花树)