最经典的二分图匹配问题:
这个问题可以像下面这样转化为图论模型来分析。我们可以像下面这样来定义无向二分图,。
是代表计算机的顶点集合,代表任务的顶点集合,对于任意的,,计算机能处理任务,那我们就在之间连一条边,。
而中满足两两不含公共端点的边集合的基数的最大值,就是我们所要求的最大的任务个数。
图论术语中,我们将这种两两不含公共端点的边集合为匹配,而元素最多的称为最大匹配。当最大匹配的匹配数满足时,又称为完美匹配,也就是每个点都匹配上了。特别地,二分图中的匹配又称为二分图匹配。像这道题目一样,二分图匹配常常在指派问题的模型中出现。那么这道题目应该如何求解呢?
解法1:最大流模型
最大流简介,我们将二分图改成一个有向图,
将原图中的所有无向边改成有向边,方向从到容量为1。增加源点和汇点,从向所有的顶点连一条容量为1的边,从所有的顶点向连一条容量为1的边。
这样变形得到的新图中最大流的流量就是原二分图中最大匹配的配数,而之间流量为正的边集合就是最大匹配。该算法的复杂度为。
解法2:匈牙利算法
盗一张网图,很久之前截下来的,忘了从哪。。。
先逐一匹配,然后有人没有妹子的时候进行回溯,看能不能腾出来一个妹子,腾到不能腾为止。
注意,对每个boy,used数组都要重新初始化,表示的是在本次寻找中是否试图更改过该girl的归属问题,如果更改成功了那么就有返回解,但是如果更改失败了,这个girl就不需要白费力气了。对男三来说,他会回溯到男2,男2此时要跳过对女2的判断,只需要向下看女3是否可以过度到他手里,如果可以就会返回true
一般图匹配
如果把这个当作一个以学生为顶点,朋友关系为边的图,就可以把这个问题转为求对应的图的最大匹配数的问题。之前的问题顶点有计算机和任务之分,所以得到的是二分图,而这里得到的却不一定是二分图。这种问题被称为一般图匹配问题,它不能像二分图一样转为最大流问题进行求解。求解一般图匹配问题可以使用Edmonds算法等高效的算法。只不Edmonds算法的实现较为复杂,所以程序设计竞赛中较少出现这类问题。如果把模型转化成了匹配问题,可以先看看事实上是否是二分图匹配,如果确实不是二分图,而用其他方法又可能行不通时,我们可以用利用Tutte矩阵来计算一般图最大匹配的匹配数。
匹配、边覆盖、独立集和顶点覆盖
注意,对二分图而言,最大匹配数目等于最小的顶点覆盖数目,因此,我们可以高效地求解二分图的最大独立集和最小顶点覆盖,事实上,这类问题也常常出现在程序设计竞赛当中。相对的,如果把问题转为一般图的最大独立集或最小顶点覆盖,则无法直接、高效地求解,有必要从其他角度重新思考。