使用 Dinic ,在根据上述 König 定理构造

  • 若该点为左边的非匹配点,则这个点必被访问,因为这个点是整个 dfsdfs 的起点
  • 若该点为右边的非匹配点,则这个点必不会被访问,若是由左边的非匹配点才到达了这个点,那么可以将这条边变为匹配边,则匹配数 +1+1 ,与最大匹配相冲突。若是左边的匹配点才到达了这个点,那么这个点的路径为左边非匹配点 → 右边匹配点 → 左边非匹配点 → 右边匹配点 → …… → 左边匹配点 → 右边非匹配点 ,很明显,上述路径为增广路,与最大匹配相冲突。所以,右边的非匹配点必不会被访问。
  • 对于一组匹配点,要么两个都被标记,要么都不被标记。因为左部的匹配点是由右部的匹配点来遍历到的,出现必然成双成对。

有了上述的三条性质,可以发现:按照选取左部点中没有被标记过的点,右部点中被标记过的点的规则,选出来的点的点数必然为最大匹配的边数。左部的非匹配点必然被访问,则必不会被选,右部的非匹配点必不会被访问,则必不会被选。而第三条性质决定了,对于一组匹配点,会选择有且仅有一个点。故而选出的点的点数等于最大匹配的边数。

其次需要解决一个问题:保证这些点覆盖了所有的边。具体可以分为四类:

  • 左部为非匹配点,右部为非匹配点。性质二已经讨论过,不可能出现这种情况,出现就不满足最大匹配的前提。
  • 左部为匹配点,右部为非匹配点。同理性质二,路径类似,会出现增广路,那么这个左部的匹配点一定没有被访问过,必然被选。
  • 左部为匹配点,右部为匹配点。一对匹配点中必选一个。
  • 左部为非匹配点,右部为匹配点。这条边为非匹配边,而起点就是从左部的非匹配点点开始,那么右部的这个点必然被访问过,必然被选。

最后在确保这是最小的方案:一条边都只选了一个点,不存在浪费。

上一篇:dinic板子


下一篇:Dinic算法模板