algorithm - 在旅游中容纳最多的人

标签 algorithm data-structures graph

我得安排一次旅行。有N个人想参加旅游。但他们中的一些人是彼此的敌人。 (敌人的敌人可能是也可能不是你的敌人。如果 A 是 B 的敌人,那么 B 也是 A 的敌人) 如果我在我的旅行中容纳一个人,我就不能容纳他的敌人。

现在我想在游览中容纳尽可能多的人数。我怎样才能找到这个号码?

例如:如果有 5 个游客,我们称他们为 A-E。 A与B、D为敌,B与E为敌,C与D为敌。

   A    B   C   D   E
  +---+---+---+---+---+
A | - | X |   | X |   |
  +---+---+---+---+---+
B | X | - |   |   | X |
  +---+---+---+---+---+
C |   |   | - | X |   |
  +---+---+---+---+---+
D | X |   | X | - |   |
  +---+---+---+---+---+
E |   | X |   |   | - |
  +---+---+---+---+---+

在这种情况下,以下行程是可能的:空、A、B、C、D、E、AC、AE、BC、BD、ACE、CE、DE 等。其中,最好的行程是 ACE,因为它可容纳 3游客,因此答案 3。

我的方法:

  • 我尝试循环并尝试与位图组合,但它们是 很慢。
  • 我目前正在使用 DFS,但正在尝试寻找更好的 方法。
  • 我尝试通过创建友谊图来工作并准备一些
    生成树。但这是行不通的,因为 A 可以和 B 一起旅行,B 也可以
    与 C 一起旅行并不能保证 A 和与 C 一起旅行。
  • 我尝试创建敌对图并找到一些薄弱环节 但最终一无所知。

如果有人能给我提示或指出解决此问题的好资源,我将不胜感激。

最佳答案

根据游客创建图表:

  • 每个节点都是游客
  • 如果两个游客是敌人,则在他们之间划清界限
  • 找到最大独立集

这篇论文中有非常详细的寻找最大独立集的算法: Algorithms for Maximum independent Sets

此方法提供了一种并行方法:Lecture Notes on a Parallel Algorithm for Generating a Maximal Independent Set

this是java实现。

关于algorithm - 在旅游中容纳最多的人,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22294981/

相关文章:

algorithm - 给定一个字典和一个字母列表,找出所有可以用这些字母组成的有效单词

Python 回溯字符串长度 n 来自字母表 {a,b,c} 与 #a=#b

algorithm - 渐近增长 : Understanding the specific proof of f(n) + little o(f(n)) = theta (f(n))?

inheritance - 如何在 Neo4j 中使用类型层次结构?

c++ - 通过 boost::read_graphviz() 读取 boost 动态属性时出现异常

python - 根据输入返回不同的输出组合

algorithm - 计数子数组的总和在 [L, R] 范围内

c++ - 这是遍历数组的更快方法

algorithm - 如何优化返回正整数 x 值的算法,使得 f(x) >=0 对于部分已知函数?

python - "Agglomerative"基于网络 X 中节点权重的图形聚类?