我在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
问题本身很容易,但如果我稍微调整一下这个问题,我想知道如何解决这个问题。
假设:
问题:
在最初的问题中,您可以通过坐在同一张桌子上的任意数量的客人了解其他客人。但是,如果你只能通过坐在桌旁的另一位客人了解其他客人,我想知道如何解决这个问题。
最好的算法是什么?谢谢你的帮助!
答案 0 :(得分:1)
这是NP难的。有一个多项式时间减少来自NP-hard问题Clique Cover,这是Karp的原始21之一,它包括通过细分每条边并连接每对新顶点来转换作为Clique Cover输入的图,所以每个新顶点距离每个顶点的距离≤2,并且当且仅当它们在输入中相邻时,两个不同的旧顶点在距离≤2处。
从这个问题轻松减少到Clique Cover,所以我建议的最佳算法是通过Clique Cover的指数时动态程序来减少这种减少。
答案 1 :(得分:0)
创建一个顶点代表客人的图表。如果每个顶点相互了解,则在每个顶点之间创建边(基于表T)。
现在您需要找到的是连接组件的数量。 连通分量是一组(S)顶点,其中在集合(S)中的任意两个顶点之间存在路径。
连接组件的数量等于您需要的表的数量。