Loading

网络流 & 二分图の学习笔记

\(\mathfrak{Part} \ 0\) 前言

因为最近一直在学网络流与二分图,所以写一下留作纪念(其实就是怕自己东西全忘光了)。

\(\mathfrak{Part} \ 1\) 网络流 & 二分图基础

首先让我们介绍一下二分图是什么,基本定义如下:

  • 如果一张无向图,能够分为两个互不相交的点集 \(A, B\),且对于任意一条边 \((u, v)\),都有 \(u \in A, v \in B \vee u \in B, v \in A\),那么这张图就叫二分图。当然点集可能有多种划分方式。

然后来讲一下二分图的判定方法:

  • 如果一张无向图没有长度为奇数的环,那么这张图就是一张二分图。

然后介绍一下网络流的概念,这里讲述一下抽象定义:

  • 对于一张有向图,每条边都有一个容量 \(c(u, v)\) 和一个不固定的流量 \(f(u, v)\),而且还有一个源点和一个汇点,满足以下性质:
  1. 容量限制,即 \(f(u, v) \le c(u, v)\)
  2. 流量守恒,即对于每个不是源点和汇点点 \(i\) 都有 \(\sum\limits_{x \to i}f(x, i) = \sum\limits_{i \to y}f(i, y)\),且源点流出的流量与汇点接受到的流量相等。

就相当于河道问题。

至于这里大家可以自学以下二分图的匈牙利求最大匹配算法和 Dinic/EK 求最大流/费用流算法。一些基本概念:增广路,残量网络等在此不做讲解。

\(\mathfrak{Part} \ 2\) 二分图的基本问题

\(\mathfrak{Part} \ 2.1\) 二分图的最大匹配

首先是一切的基础:二分图最大匹配问题。定义如下:

  • 找到最多的边数,使得这些边都没有共同的端点。

然后我们可以使用匈牙利算法 A 了这道题。同样我们使用网络流也可以做,就是把源点连向左点集里的点,右点集的点连向汇点,然后边权为 \(1\) 跑最大流就 OK 了。

接下来讲讲如何输出方案:考虑对于右部点我们匈牙利都有一个 \(match\),然后直接输出就行了,而网络流则是找剩余流量为 \(0\) 的边。

然后讲一下建模方法:就是取得两个点不能相同(也对应端点不同),记住这句话很关键!!!

接下来讲讲矩阵游戏这道题怎么做:我们发现对角线上的点横竖都是不相同的,而且交换行或列都不会改变元素集合,所以我们考虑如果一个点为 \(1\),那么对应的行向列连边,跑最大匹配就行了,看,是不是 “不相同” 这个字眼非常的关键,只不过隐藏在对角线里了。

还有一道题目叫小狗散步,相对比较简单,可以独立完成。

\(\mathfrak{Part} \ 2.2\) 二分图的最小点覆盖

然后是最小点覆盖问题,基本定义如下:

  • 选取最少点的个数,使其能覆盖所有的边,或者这么说,对于一条边,要么选其中一个端点,要么两个都选,不能不选。

然后就是著名的 König 定理,要说的内容只有一个:最小点覆盖 = 最大匹配,定理内容如下:

  • 考虑如果设最大匹配为 \(a\),最小点覆盖为 \(b\),那么最大匹配中的每条边一定能够覆盖所有的端点(最大匹配的定义),则 \(b \ge a\),从最小点覆盖的点集中,每个点可以射出一条边形成一组最大匹配,所以 \(b \le a\),由此可知,\(b = a\)

主要证明方法就是构造。

然后建模思路基本一致:每条 "边" “至少” 要选一个 “端点”。

然后讲一道板题,但是要输出方案,题号为 P7086,考虑怎么输出,对于每个右部点,如果 \(match = 0\),那么进行 DFS,对于 DFS 内部,我们给遍历到的结点打标记,如果这个点是右部点,那么走非匹配边,否则就走匹配边。这样,左部打了标记的点可以加入点集,右部没打标记的点不能加入点集。至于这道题的建模,就是前缀往后缀连边啦!

\(\mathfrak{Part} \ 2.3\) 二分图的最大独立集

然后是最小点覆盖的相反面,最大独立集,基本定义如下:

  • 选出一个点集,使得任意两点之间没有连边。

不难发现最大独立集 = \(n\) - 最小点覆盖,所以如果最大独立集需要你输出方案,那么就是最小点覆盖的方案之外的其他点就是了。

相比最小点覆盖,经典的建模是两点之间互相不能攻击,这种建模方法常常用在网格图中,对于一般网格图,我们可以黑白染色,然后跑最大匹配,但是对于一些特殊题目而言,需要我们使用不同的染色方法。

比如说长脖子鹿这道题,我们就不能进行普通的黑白染色,而是对于行的奇偶性黑白染色,不难发现这样的正确性。

\(\mathfrak{Part} \ 2.4\) 最大团问题

然后讲一下最大团,基本定义如下:

  • 对于一张无向图,我们找出若干个可以相同的点集,使得两两之间,我们通常把点数和称作最大团。

对于一个最大团,我们该如何求呢,一个结论是:

  • 原图上的最大团等同于补图上的最大独立集。

其中补图是把原图边的状态反过来。

然后我们看一道题目,新型城市化,这道题规定不超过两个最大团,所以它的补图一定是一张二分图,所以是在补图上跑最大匹配,求所有的删掉了最大匹配就会减一的边,明显可以在网络流的残余网络里跑 tarjan 找强连通分量,判断一条边能否被另一条替代就 OK 啦!

posted @ 2023-08-09 22:22  Alexande  阅读(24)  评论(0)    收藏  举报