【问题标题】:What kind of algorithm should I use for this round table problem?我应该使用什么样的算法来解决这个圆桌问题?
【发布时间】:2021-01-14 14:35:55
【问题描述】:

我的任务是根据 N 位客人对其他客人的好恶来确定我是否可以让 N 位客人坐在圆桌旁。座位安排有两个要求:

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

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

输出:布尔值


蛮力解决方案将从 0 号客人开始并检查所有可能的座位,但这绝对是低效的。

这似乎是二分问题的一种变体,但我不知道从哪里开始。

任何意见将不胜感激!

【问题讨论】:

  • 盲目猜测:1)构建(有向?)图,其中顶点 - 是客人,边 - 如果客人喜欢另一个。 2) 找到哈密顿循环
  • @user3386109 我认为这两个要求是互斥的,因为好处不一定是相互的。例如,如果客人 A 喜欢客人 B,但客人 B 不喜欢客人 A,则他们不应坐在一起。如果没有要求 1,结果将包括 A 和 B 坐在一起的情况。

标签: algorithm math data-structures graph computer-science


【解决方案1】:

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

为了减少:

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

-对于输入图G = (V, E),那么对于每一对顶点u,v:

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

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

-有了这些知识,我们可以对 HAM-CYCLE 问题返回真或假,并在多项式时间内解决了它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-09
    • 1970-01-01
    • 2019-08-02
    • 2015-09-30
    • 2016-03-09
    • 2015-06-13
    • 2021-04-09
    • 2022-11-30
    相关资源
    最近更新 更多