在之前的两篇文章中,我们讲述了「最大流问题」和「Ford-Fulkerson 最大流求解方法」,当然在阅读这篇文章之前,我需要你有以上两篇文章的基础,请在阅读上面两篇文章后再来进行阅读。这篇文章我们来讲述一个二分图匹配问题。并且将这个问题转化为最大流问题模型来解决。
为了引出二分图匹配问题,我们首先给出一个实际问题的例子:
计算机 CPU 指派问题
在我的 N 核计算机上有 K 个任务。每个任务在工作时都得霸占 CPU 一个完整的核心,并且每个 CPU 核心不是所有任务都能处理,只能处理其中几种任务。我们的问题是在一次处理过程中,最多能够处理的任务数是多少?
上图中我描述了一组样例,在这组样例中 Task A
只能有 CPU X
和 CPU Y
来处理,Task B
只能由 CPU X
和 CPU Z
来处理,而 Task C
只能有 CPU Y
来处理。
问题抽象与二分图最大匹配
其实上面对于样例的描述我们已经可以画出一个有向图了。我们将 Task 和 CPU 都转换成图节点:
我们发现,这个图他可以分成左右两部分,并且左边这些节点相互之间没有相连的边,同样的右边节点也没有相连的边,所有的边都是左右两个部分之间的连接,对于这种特点的图,在图论中有一个专有的名词,二分图。
而对于这个问题,我们需要求最多有多少个任务可以被处理,也就是说根据关系找到一种 Task 和 CPU 的配对方式,使得配对数量达到最大