【问题标题】:Ford Fulkerson algorithm JavaFord Fulkerson 算法 Java
【发布时间】:2014-10-11 05:16:14
【问题描述】:

我需要帮助实现以下调度问题的有效算法。

明天有n的病人来医院做健康检查,但是只有2位医生(A医生和B医生)。每次健康检查需要一个医生的时间段。如果可能的话,我需要将那些n 患者分配到n 时隙,只使用一名医生。如果不可能有 1 位医生,我最多可以分配 2 位医生,因为只有 2 位医生可用。如果2个医生还不够。直接输出impossible

我将患者的可用性作为输入。比如有5个病人,1号病人只在1、2、5时段可用,2号病人在3、4时段可用,3号病人在1号时段可用……以此类推.

P1: 1 2 5
P2: 3 4
P3: 1
P4: 2
P5: 3 5

在这种情况下,我只需要一名医生来完成这项工作。输出

P1: Time slot 5 - Doc A
P2: Time slot 4 - Doc A
P3: Time slot 1 - Doc A
P4: Time slot 2 - Doc A
P5: Time slot 3 - Doc A

如果我得到如下输入:

P1: 1 2 5
P2: 3 4
P3: 2
P4: 2
P5: 3 5

那么我需要分配两位医生,因为 P3 和 P4 在可用性方面存在冲突。 输出:

P1: Time slot 5 - Doc A
P2: Time slot 4 - Doc A
P3: Time slot 2 - Doc A
P4: Time slot 2 - Doc B
P5: Time slot 3 - Doc A

解决此类问题最有效的算法是什么?我该如何为此实现福特富尔克森算法?

到目前为止我做了什么。

我试图将每个患者的可用时间段存储到单独的数组中。

按长度对数组进行排序。首先为患者分配可用时隙最少的患者。

分配患者后,删除其余数组中的此时间段,并再次按长度对数组进行排序。

重复此过程,直到分配所有患者。

【问题讨论】:

  • 我有一个想法,但我不知道与您的代码相比是否有效。你能显示你的代码吗?
  • 我想知道当她有超过 1 个可用时隙时,您将如何为患者分配最少可用时隙

标签: java algorithm ford-fulkerson


【解决方案1】:

让我们更深入地研究一下这个问题。我们有一组患者、一组时隙以及它们之间的一些联系(在给定时间的患者可用性)。它看起来就像二分图中的最大匹配问题!所以第一组顶点应该对应患者(每个患者一个顶点),第二组应该对应时隙(每个时隙一个顶点)。当且仅当患者在该时间段可用时,在来自第一组的顶点和来自第二组的顶点之间存在边。如果最大匹配大小等于患者人数,那么一名医生就足够了,否则没有。

如何为 2 位医生解决这个问题?几乎相同的方式。我们仍然可以为患者和时隙构造二分图,但是现在我们在第二组中每个时隙都有 2 个顶点(一个用于第一个医生,第二个用于另一个医生)。边缘也以相同的方式添加。同样,我们需要检查的是最大匹配大小等于患者数量。

要在二分图中找到最大匹配,可以使用 Dinic 或 Hopcroft-Karp 算法得到 O(M * sqrt(N)) 时间复杂度,其中 N 是顶点数,M 是边数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-21
    • 2015-06-07
    • 1970-01-01
    • 2019-07-04
    • 2014-05-09
    • 1970-01-01
    相关资源
    最近更新 更多