我需要帮助实现以下调度问题的有效算法。
明天有病人来医院做健康检查,但只有两个医生(A医生和B医生)每次健康检查需要一个医生的时间段。如果可能的话,我只需要一个医生就可以把那些n
病人分配到n
时间段如果1名医生是不可能的,我可以分配最多2名医生,因为只有2名医生。如果两个医生仍然不够。简单输出n
我把病人的可用性作为输入例如,有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
对于这样的问题,最有效的算法是什么?如何实现福特富尔克森算法?
我到目前为止所做的。
我试图将每个病人的可用时间段存储到单独的数组中。
按长度对数组排序。先给病人分配最少的时间段。
分配患者后,删除剩余数组中的这个时隙,并再次按长度对数组进行排序。
重复此过程,直到所有患者都被分配。
最佳答案
让我们更深入地研究一下这个问题我们有一组患者,一组时间段和他们之间的一些联系(在给定时间内患者的可用性)它看起来像二分图中的最大匹配问题!因此,第一组顶点应该对应于患者(每个患者一个顶点),第二组顶点应该对应于时隙(每个时隙一个顶点)如果且仅当患者在此时间段可用时,第一个集合的顶点和第二个集合的顶点之间才有边。如果最大匹配大小等于患者数,那么一个医生就足够了,否则没有。
两个医生怎么解决这个问题差不多一样。我们仍然可以为病人和时隙构造二部图,但是现在我们在每个时隙的第二集合中有两个顶点(一个用于第一个医生,另一个用于另一个医生)边的添加方式也相同。再次,我们需要检查的是最大匹配大小等于患者的数量。
为了找到二分图中的最大匹配,可以使用Dinic或Hopcroft Karp算法得到O(M * sqrt(N))
时间复杂度,其中N
是顶点的数目,而M
是边的数目。
关于java - 福特富尔克森算法Java,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26311358/