图的匹配问题
在图论中,匹配问题是一个重要的研究课题,广泛应用于资源分配、网络流、任务调度等领域。图的匹配指的是一个子集边集,其中没有任何两条边共享一个公共顶点。具体来说,假设有一个无向图 \(G=(V, E)\),其中 \(V\) 表示顶点集合,\(E\) 表示边集合。图的匹配是边的一个集合 \(M \subseteq E\),满足对于任意两条边 \(e_1 = (u_1, v_1)\) 和 \(e_2 = (u_2, v_2)\),都有 \(u_1 \neq u_2\) 且 \(v_1 \neq v_2\),即没有顶点重复出现在两条边中。
图的匹配问题可以根据目标的不同,细分为多个类型。最常见的类型是最大匹配 和最大权重匹配。
-
最大匹配 :在所有可能的匹配中,边的数量最多的匹配称为最大匹配。即对于一个给定图\(G\),最大匹配是包含最大数量边的匹配。我们通常用 \(M_{\text{max}}\) 表示最大匹配,其大小为 \(|M_{\text{max}}|\),即匹配中包含的边数。
-
最大权重匹配 :当图的边带有权重时,我们追求的是边权和最大的匹配。具体而言,给定一个图 \(G=(V, E)\),每条边 \(e \in E\) 有一个与之关联的权重 \(w(e)\),最大权重匹配是使得匹配中的边的权重之和最大化的匹配。我们用 \(M_{\text{max\_weight}}\) 表示最大权重匹配,其目标是:
\[\max_{M \subseteq E} \sum_{e \in M} w(e) \]

其中,每一个节点都有一个匹配边相连的匹配叫做完美匹配 ,完美匹配若存在,则必然是最大匹配。只有偶数个节点的图才可能有完美匹配 ,匹配边数 \(\frac V 2\)。
二分图及其匹配
二分图(Bipartite Graph)是图论中的一种特殊图结构,它的顶点集可以被划分成两个不相交的子集,使得每条边都连接这两个子集中的一个顶点。换句话说,二分图 \(G=(V, E)\) 是一个图,其中顶点集 \(V\) 可以分为两个子集 \(V_1\) 和 $V_2 $,且任意一条边都连接 \(V_1\) 中的顶点和 \(V_2\) 中的顶点,而不可能有边连接两个 \(V_1\) 中的顶点或两个 \(V_2\) 中的顶点。直观上,二分图长得很像我们中小学做的连线题,他刚好可以把点集划分为两个子集,子集内无边,所有边都是两个子集之间的边。
形式上,二分图的定义为:如果存在一个划分 \(V = V_1 \cup V_2\) ,且对于任意边 \(e = (u, v) \in E\),都有 \(u \in V_1\) 且 \(v \in V_2\)(或反之),那么图 \(G\) 就是一个二分图。
二分图有很多实际应用,例如任务分配、网络匹配、推荐系统等。其独特的结构使得二分图匹配问题相比一般图的匹配问题更加简单且具有优良的算法性质。
判定二分图
判定一个图是否为二分图,最常见的判定方法是利用染色法,该方法基于图的二分性特性,即一个二分图的顶点可以被染成两种颜色,且每条边连接的两个顶点的颜色不同。
我们随便选取一个顶点并将其染成颜色1。接下来对于每个已染色的顶点,检查它的邻居。如果邻居未染色,则给它染上与当前顶点不同的颜色;如果邻居已经染色且颜色与当前顶点相同,则说明图中存在一条边连接两个相同颜色的顶点,从而该图不是二分图;如果在图中所有顶点都能成功染色且没有颜色冲突,则该图是二分图。
另外,二分图的一个重要性质是二分图没有奇数长度的环(实际上是图为二分图的充分必要条件)。
二分图的匹配
对于一般的无向图 \(G=(V, E)\),其中没有任何关于顶点集合的约束,图的匹配问题相对复杂。而在二分图中,由于所有的边都仅连接两个不同子集中的顶点,独特的性质使得求解二分图匹配的特有算法更加高效。
用最大流解决二分图最大匹配
由于二分图的优秀性质。其最大匹配问题可以通过转化成最大流算法来高效解决。具体来说,给定一个二分图 \(G=(V_1 \cup V_2, E)\),我们可以构建一个流网络,将原本的匹配问题转化为寻找一个流量最大的网络流问题。
在二分图中,顶点集 \(V\) 被分为两个不相交的子集 \(V_1\) 和 \(V_2\)。我们想要找到一个匹配,意味着要在 \(V_1\) 和 \(V_2\) 之间选择一些边,使得这些边所连接的顶点不重复,并且数量最大。为了将此问题转化为最大流问题,我们进行如下构建:
- 在二分图的基础上,额外添加一个源点 \(s\) 和汇点 \(t\),构成流网络。
- 对于每个顶点 \(u \in V_1\),添加一条从源点 \(s\) 到 \(u\) 的边,边的容量设为 1。
- 对于每个顶点 \(v \in V_2\),添加一条从 \(v\) 到汇点 \(t\) 的边,边的容量设为 1。
- 对于二分图中的每一条边 \(e = (u, v)\),其中 \(u \in V_1\) 且 \(v \in V_2\),添加一条从 \(u\) 到 \(v\) 的边,边的容量也设为1。
- 在这个流网络中,我们的目标是找到最大流,最大流量的大小恰好对应于二分图中的最大匹配的边数。

这样做正确且符合直觉。这里的每条边的容量设为1,表示一个顶点只参与一次匹配。源点到 \(V_1\) 的边保证了每个 \(V_1\) 中的顶点可以被匹配,而 \(V_2\) 到汇点的边保证了每个 \(V_2\) 中的顶点也只能被匹配一次。最大流的值是多少,就代表有多少流量可以穿过二分图中的边到达另一集合再抵达汇点,每一单位的流量代表着一个匹配的边。
为什么最大流算法在这样的图上高效?
将二分图最大匹配问题转化为最大流问题后,我们可以利用最大流算法来高效求解。最大流算法通常使用 Ford-Fulkerson 增广 (如 Edmonds-Karp 或 Dinic 等)。通常的最大流算法复杂度较高,但是在这个性质特殊的图里,实际上很高效。
-
容量为1的边:在构建的流网络中,每条边的容量都是1。这意味着每次通过增广路径寻找流时,每条边只能通过一个单位的流量,这大大简化了计算。每次流量的增广就等价于找到了一条匹配边。
-
图的结构特殊:使用最大流算法时,寻找增广路径(即未满流的路径)是解决问题的核心。构造出来的图总是一个二分图加上源点和汇点,绝大多数点的入度或出度是 1。
以 Dinic 为例,在一般的图上,dinic 的一轮增广复杂度上界为 \(O(VE)\),增广轮数上界 \(O(V)\),一共是 \(O(V^2E)\);但是在满足上述两特殊条件的图上,可以用数学知识证明:一轮增广复杂度上界为 \(O(E)\),增广轮数上界 \(O(\sqrt V)\),一共是 \(O(\sqrt VE)\)。
从最大匹配到最大权重匹配的改造
对于图带有边权重的匹配问题,即最大权重匹配问题。最大权重匹配要求找到一个匹配,使得匹配的边的权重之和最大。相应的,我们将探讨如何将最大权重匹配问题转化为费用流问题,并借助最小费用最大流算法来求解。
我们将问题转化为一个带有费用的流网络。具体转化步骤如下:
- 与求解最大匹配时相同,仍然从二分图中构建一个流网络。
- 设源点为 \(s\),汇点为 \(t\),对于每个 \(u \in V_1\),添加从源点到 \(u\) 的边,边的容量为 1,费用为 0;对于每个 \(v \in V_2\),添加从 \(v\) 到汇点 \(t\) 的边,边的容量为1,费用为 0。
- 对于二分图中的每一条边 \(e = (u, v)\),添加一条从 \(u\) 到 \(v\) 的边,边的容量也设为1,但边的费用为 \(-w(u, v)\)(负号的引入是为了将最大化问题转化为最小化问题)。
- 在这个流网络中,我们的目标是通过流量最大化来得到最大匹配的同时,最小化流量通过的费用。换句话说,我们希望通过最小费用最大流算法来找出一种流动方式,使得匹配的权重之和最大。由于每条边的费用被设置为 \(-w(u, v)\),最小费用最大流的求解结果正是最大权重匹配的结果。
在这个网络中,每条边的容量为 1,表示每次流动通过的边代表一条匹配。每条从 \(u\) 到 \(v\) 的边的费用是负的边权 \(-w(u, v)\),目的是将原来的最大权重和转化为最小费用流问题。通过最小化负权和,我们实际上是在最大化匹配的权重和。
拓展知识:König定理
在二分图中,除了最大匹配之外,还有两个重要的概念:最小点覆盖 和最大独立集。它们与最大匹配之间有着密切的关系,且在二分图中,最大匹配、最小点覆盖和最大独立集三者之间是互相等价的。
-
最小点覆盖 :
在一个图中,点覆盖是指一个顶点集 \(S \subseteq V\),使得图中每一条边至少有一个端点在 \(S\) 中。最小点覆盖是点覆盖中包含顶点数最少的那个集合。对于二分图 \(G=(V_1 \cup V_2, E)\),最小点覆盖指的是一个最小的顶点集 \(C \subseteq V_1 \cup V_2\),满足每条边都有一个端点在 \(C\) 中。
-
最大独立集 :
在图论中,独立集是指一个顶点集 \(I \subseteq V\),其中图中任意两顶点之间没有边相连。最大独立集是包含最多顶点的独立集。对于二分图 \(G=(V_1 \cup V_2, E)\),最大独立集指的是一个包含 \(V_1\) 和 \(V_2\) 中顶点的最大独立集,且没有任何两个顶点在图中通过边连接。
在二分图中,最大匹配、最小点覆盖和最大独立集之间存在一个著名的König定理,该定理指出:
\[最大匹配的大小 = 最小点覆盖的大小 = V - 最大独立集的大小 \]
如果我们已知二分图中的最大匹配 \(M\),则可以通过匈牙利算法中增广路的方式来操作,构造一个最小点覆盖。最大匹配的大小直接决定了最小点覆盖的大小,且它们的大小相等。而最小覆盖集反选可以直接得到最大独立集,所以他们也密切相关。