好的,让我们试试。我们有8名学生(1..8)和4个部分。每个学生都在一个部分,每个部分有2个学生的空间。大多数学生想要切换,但不是全部。
在下表中,我们看到学生当前的部分,他们需要的部分以及队列中的位置(如果有的话)。
+------+-----+-----+-----+
| stud | now | req | que |
+------+-----+-----+-----+
| 1 | A | D | 2 |
| 2 | A | D | 1 |
| 3 | B | B | - |
| 4 | B | A | 2 |
| 5 | C | A | 1 |
| 6 | C | C | - |
| 7 | D | C | 1 |
| 8 | D | B | 1 |
+------+-----+-----+-----+
我们可以提出一个图这样的信息:
+-----+ +-----+ +-----+
| C |---[5]--->1| A |2<---[4]---| B |
+-----+ +-----+ +-----+
1 | | 1
^ | | ^
| [1] [2] |
| | | |
[7] | | [8]
| V V |
| 2 1 |
| +-----+ |
\--------------| D |--------------/
+-----+
我们试图找到的空缺部分,但我们发现没有人。因为所有部分都已满,我们需要一个肮脏的窍门。因此,让我们随机选择一个非空的队列。在这种情况下,部分A并假设,它有一个额外的位置。这意味着学生5可以进入A部分,在C部分留下由学生7留下的空缺。这在D部分留下了学生2的空缺。我们现在在A部分有一个空缺。但是我们假设该部分A有一个额外的位置,所以我们可以消除这个假设并获得了一个更简单的图。
如果路径从未返回到A部分,请撤消移动并将A标记为无效的起点。重试另一节。 如果没有有效的部分,我们就完成了。
现在,我们有以下的情况:
+-----+ +-----+ +-----+
| C | | A |1<---[4]---| B |
+-----+ +-----+ +-----+
| 1
| ^
[1] |
| |
| [8]
V |
1 |
+-----+ |
| D |--------------/
+-----+
我们重复与另一随机部分的伎俩,这解决了图形。
如果您从当前尚未分配的几名学生开始,则会添加一个额外的虚拟部分作为其起点。当然,这意味着任何部分都必须有空缺,否则问题是不可解决的。
请注意,由于队列中的顺序,有可能没有解决方案。
哈哈O(坏)< - 可爱。 – 2009-01-09 21:40:17
标记为“家庭作业”。这可能不是你的家庭作业,但它可能是某个人的某个时刻,因为几年前我在大学里有过这个问题。 – 2009-01-09 21:41:24
更改为不是我的作业,以更好地反映现实 – BCS 2009-01-09 21:44:13