2

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

明天有n病人来医院体检,但只有2位医生(A医生和B医生)。每次健康检查需要一个医生的时间段。如果可能,我需要将这些n患者分配到n仅使用 1 名医生的时间段。如果不可能有 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

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

到目前为止我所做的。

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

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

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

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

4

1 回答 1

1

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

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

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

于 2014-10-11T07:29:47.690 回答