加边法解决二分图最大匹配问题,说起来其实挺直接的。它本质上是将一个难以直接处理的匹配问题,转化为一个可以通过网络流模型解决的问题。咱们一步步来看。
问题的本质:寻找最大匹配
首先,要理解我们面对的是什么问题。在二分图中,最大匹配就是找出图中能够配对(也就是连接边)的边的最大数量,而且要求每个顶点最多只能参与一对匹配。这就像是要给两个人配对,每个人只能和另一个人配一次,我们要尽可能多地促成这样的配对。
加边法的核心思想:转化为最大流
为什么我们要用“加边法”?因为二分图的最大匹配问题,虽然可以直接用匈牙利算法等方法解决,但很多时候,尤其是在更复杂的图论问题或者与其他问题的结合中,将它转化成一个最大流问题会更加通用和方便。
加边法的思路就是:构建一个新的网络图,在这个网络图上,原二分图的匹配问题就变成了找到一条从源点到汇点的路径的最大流量问题。
构建新的网络图
咱们假设原二分图是 $G=(V, E)$,其中 $V$ 可以被分成两个独立的顶点集 $U$ 和 $W$,所有边都连接 $U$ 中的顶点和 $W$ 中的顶点。现在我们要建一个带有方向的网络 $N=(V', E')$ 来解决这个问题。
1. 添加源点 ($s$) 和汇点 ($t$):
我们引入一个新的源点 $s$ 和一个新的汇点 $t$。
2. 连接源点到第一个顶点集 ($U$):
对于原二分图 $G$ 中的每一个顶点 $u in U$,我们在网络 $N$ 中添加一条从源点 $s$ 到 $u$ 的有向边。
关键:这条边的容量(Capacity)设为 1。 这是为了确保每个 $U$ 中的顶点最多只能“贡献”一次流量,对应到匹配就是每个 $U$ 中的顶点最多只能被匹配一次。
3. 连接第一个顶点集 ($U$) 到第二个顶点集 ($W$):
对于原二分图 $G$ 中任意一条连接 $u in U$ 和 $w in W$ 的边 $(u, w) in E$,我们在网络 $N$ 中添加一条有向边从 $u$ 指向 $w$。
关键:这条边的容量也设为 1。 这表示在这条边上最多只能流过 1 的流量。如果这条边在网络流中被使用了(即有流量通过),就意味着在原二分图中,$u$ 和 $w$ 进行了匹配。
4. 连接第二个顶点集 ($W$) 到汇点 ($t$):
对于原二分图 $G$ 中的每一个顶点 $w in W$,我们在网络 $N$ 中添加一条从 $w$ 指向汇点 $t$ 的有向边。
关键:这条边的容量同样设为 1。 这确保了每个 $W$ 中的顶点也最多只能“接收”一次流量,对应到匹配就是每个 $W$ 中的顶点最多只能被匹配一次。
为什么这样行得通?(流量与匹配的对应关系)
现在我们有了这个构建好的网络 $N$。在这个网络里,任何一条从 $s$ 到 $t$ 的路径都必然形如:$s o u o w o t$,其中 $u in U$ 且 $w in W$,并且 $(u, w)$ 是原二分图 $G$ 中的一条边。
容量为 1 的限制起到了关键作用:
$s o u$ 的容量为 1:保证了 $u$ 最多只能流出 1 的流量,意味着 $u$ 最多只能被匹配一次。
$u o w$ 的容量为 1:保证了如果 $u$ 和 $w$ 被匹配了,这条边就“用掉”了 1 的容量。
$w o t$ 的容量为 1:保证了 $w$ 最多只能接收 1 的流量,意味着 $w$ 最多只能被匹配一次。
最大流的意义: 在这个网络中,从 $s$ 到 $t$ 的最大流就等同于原二分图 $G$ 的最大匹配的大小。为什么?
因为每一单位的流量从 $s$ 流到 $t$,都必须经过一条 $s o u o w o t$ 的路径。这条路径上的每一条边容量都是 1。
一条流量路径就对应着原二分图中的一条匹配边 $(u, w)$。
由于每个 $u$ 和 $w$ 的出入流量都被限制在 1,这意味着没有两个流量路径会共享同一个 $u$ 或 $w$,这就保证了所得的匹配是合法的(不冲突)。
最大流就是能同时满足这些容量限制的最大的流量值,也就对应了最多的合法匹配。
如何找到匹配的具体边?
一旦通过最大流算法(比如 EdmondsKarp 或 Dinic 算法)算出了最大流的值,并且找到了实际的流量分配方案,我们就可以直接从流量分配中找出匹配的边:
在网络 $N$ 中,如果存在一条从 $u in U$ 到 $w in W$ 的有向边,并且这条边的流量是 1(也就是说,实际流过这条边的流量是 1),那么在原二分图 $G$ 中,$u$ 和 $w$ 就被匹配了。
举个例子感受一下
假设我们的二分图有两个顶点集 $U={u_1, u_2}$ 和 $W={w_1, w_2, w_3}$,边集 $E = {(u_1, w_1), (u_1, w_2), (u_2, w_2), (u_2, w_3)}$。
我们要构建的网络图 $N$ 会是这样的:
1. 加入源点 $s$ 和汇点 $t$。
2. 连接 $s$ 到 $U$ 的顶点:
$s o u_1$,容量 1
$s o u_2$,容量 1
3. 连接 $U$ 的顶点到 $W$ 的顶点(根据原图的边):
$u_1 o w_1$,容量 1
$u_1 o w_2$,容量 1
$u_2 o w_2$,容量 1
$u_2 o w_3$,容量 1
4. 连接 $W$ 的顶点到 $t$:
$w_1 o t$,容量 1
$w_2 o t$,容量 1
$w_3 o t$,容量 1
现在在这个网络 $N$ 上跑最大流算法。
我们可以找到以下几条路径,并且总流量最大是 2:
路径 1:$s o u_1 o w_1 o t$ (流量 1)
路径 2:$s o u_2 o w_3 o t$ (流量 1)
因为我们使用了最大流算法,所以可以保证这是最大的可能流量。
从这些流量路径中,我们得到匹配是:
路径 1 意味着 $(u_1, w_1)$ 被匹配。
路径 2 意味着 $(u_2, w_3)$ 被匹配。
最终的最大匹配是 ${(u_1, w_1), (u_2, w_3)}$,大小为 2。
总结加边法的步骤
用加边法解决二分图最大匹配问题,就是这么一个套路:
1. 拆分二分图: 明确出二分图的两个顶点集 $U$ 和 $W$。
2. 构造网络图:
创建源点 $s$ 和汇点 $t$。
从 $s$ 向 $U$ 中的每个顶点连一条容量为 1 的边。
对于原二分图中的每一条边 $(u, w)$(其中 $u in U, w in W$),在网络中从 $u$ 向 $w$ 连一条容量为 1 的有向边。
从 $W$ 中的每个顶点向 $t$ 连一条容量为 1 的边。
3. 求解最大流: 在构造好的网络图上,使用任意一种最大流算法(如 EdmondsKarp, Dinic 等)计算从 $s$ 到 $t$ 的最大流量。
4. 解释结果: 最大流的值就是二分图的最大匹配数。通过查看网络中从 $U$ 到 $W$ 的那些边上的实际流量是否为 1,就能确定具体的匹配对。
这种方法之所以强大,是因为它把一个图论的匹配问题,完美地转化成了另一个更通用的图论问题——网络流。这使得我们可以利用成熟且高效的网络流算法来解决匹配问题,而且也方便将匹配问题嵌入到更复杂的流网络模型中。