婚礼策划人

时间:2015-11-04 21:59:19

标签: algorithm

我在6.006麻省理工学院OpenCorseWare上遇到了问题,这是以下链接中的问题#6:http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-006-introduction-to-algorithms-fall-2011/exams/MIT6_006F11_final.pdf

问题本身很容易,但如果我稍微调整一下这个问题,我想知道如何解决这个问题。

假设:

  • 嘉宾名单V
  • 查找表T,其中对于u∈V的T [u]是您知道的客人列表 (如果你知道v,那么v知道你)

问题:

  • 安排座位,以便桌子上的任何客人直接或通过一些另一位坐在同一张桌子上的客人知道坐在同一张桌子上的其他客人。
  • 查找达到此要求所需的最少表数

在最初的问题中,您可以通过坐在同一张桌子上的任意数量的客人了解其他客人。但是,如果你只能通过坐在桌旁的另一位客人了解其他客人,我想知道如何解决这个问题。

最好的算法是什么?谢谢你的帮助!

2 个答案:

答案 0 :(得分:1)

这是NP难的。有一个多项式时间减少来自NP-hard问题Clique Cover,这是Karp的原始21之一,它包括通过细分每条边并连接每对新顶点来转换作为Clique Cover输入的图,所以每个新顶点距离每个顶点的距离≤2,并且当且仅当它们在输入中相邻时,两个不同的旧顶点在距离≤2处。

从这个问题轻松减少到Clique Cover,所以我建议的最佳算法是通过Clique Cover的指数时动态程序来减少这种减少。

答案 1 :(得分:0)

创建一个顶点代表客人的图表。如果每个顶点相互了解,则在每个顶点之间创建边(基于表T)。

现在您需要找到的是连接组件的数量。 连通分量是一组(S)顶点,其中在集合(S)中的任意两个顶点之间存在路径。

连接组件的数量等于您需要的表的数量。