我得安排一次旅行有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/

10-12 14:13