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