【问题标题】:maximum bipartite matching (ford-fulkerson)最大二分匹配(ford-fulkerson)
【发布时间】:2014-05-09 22:29:17
【问题描述】:

我正在阅读 http://www.geeksforgeeks.org/maximum-bipartite-matching/http://en.wikipedia.org/wiki/Ford%E2%80%93Fulkerson_algorithm 并且无法理解。似乎这个例子是在假设每个工作只能接受 1 人并且每个人想要一份工作的情况下。我想知道如果 v 集的容量 > 1(可以为该工作雇用多个人)并且 u 集 > 1(每个人想要超过 1 份工作),算法/代码将如何变化?

【问题讨论】:

  • 你只需要在图的左侧和右侧的边容量 > 1 并像往常一样找到最大流量。您的算法需要更通用一些才能跟踪增广路径的瓶颈容量。您可以阅读有关 Ford-Fulkerson on Wikipedia 的信息
  • 所以假设每个人都想要 2 个工作,每个工作有 3 个可用位置。图表会像这样吗? i.imgur.com/B0SvQjU.png
  • 中间的边应该有容量 1,除非您想多次将一个人分配给同一个工作(这可能是明智的,具体取决于您的用例)。然后在该图中找到最大流量并检查它是否等于 8(左侧容量总和)。如果没有,那么您就无法满足工作的所有需求

标签: algorithm max-flow ford-fulkerson


【解决方案1】:

要允许为工作分配多个人,您只需将边缘容量从 Jobs 修改为 Terminal(类似于 Niklas B. 在 his comment 中描述的方式,但不完全一样。)

像这样:

SourcePeople 的容量为 1,从PeopleJobs 的容量为 1 保证了一个人只会被选中从事一项工作(因为他们可以整体贡献的最大流量是 1)。但是,从JobsTerminal 的容量> 1 允许将多个人分配给该工作。

如果一个人还可以完成一项以上的工作,那么从SourcePerson 的最大流量会增加该数量:

其中ijkx 是值为 >= 1 的整数的替代项

这里要记住的关键是People 左侧的流动能力决定了他们可以从事多少工作,Jobs 右侧的流动能力决定了可以分配多少人从事该工作。中间的容量不应该改变。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-07
    • 1970-01-01
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    相关资源
    最近更新 更多