对于此圆桌会议问题,我应使用哪种算法?

问题描述

我的任务是根据他们对其他客人的喜欢/不喜欢,确定我是否可以让n位客人坐在圆桌旁。座位安排有两个要求:

  1. 所有客人都不应坐在自己不喜欢的客人旁边
  2. 所有客人应坐在他们喜欢的客人旁边

输入: likeSet = {guest_id:[其他访客列表]}, dislikeSet = {guest_id:[其他访客列表]}

输出:布尔值


一种蛮力解决方案将从座位0的客人开始,然后检查所有可能的座位,但这绝对是无效的。

这似乎是分割问题的一种变体,但我不确定从哪里开始。

任何输入将不胜感激!

解决方法

正如tym32167在评论中指出的那样,该问题类似于哈密顿循环问题,这意味着它是NP难解的,不可能有多项式时间解。

减少:

-假设我们有一个有效的解决方案来解决当前的问题。我们将用它来解决HAM-CYCLE实例,这是一个已建立的NP-hard问题。

-对于输入图G =(V,E),然后对于每对顶点u,v:

  1. 如果(u,v)在E中,则表示您“喜欢” v
  2. 否则,你“不喜欢” v

-然后,我们使用有效的解决方案来计算布尔值输出:这些来宾可以坐在桌子周围吗?如果可以的话,我们知道有一个来宾顺序,每个元素“喜欢”相邻的元素(连接到它们),最后一个“喜欢”第一个元素(一个周期),这样每个客人坐在最多一次(简单周期),并且每个客人至少坐一次。

-有了这些知识,我们就可以在多项式时间内解决了HAM-CYCLE问题,然后返回true或false。