在旅游中容纳最多的人

时间:2014-03-10 08:09:14

标签: 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旅行。
  • 我尝试创建敌意图并找到一些薄弱环节 但最终无能为力。

如果有人能给我一个提示或指出一个很好的资源来解决这个问题,我将感激不尽。

3 个答案:

答案 0 :(得分:4)

从游客创建图表:

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

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

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

this是一个java实现。

答案 1 :(得分:2)

首先创建一个向量数组 -

vector<int> enemy[N];

和一个数组curr [N]告诉他是否要去。 如果人x正在进行,则curr [x] = 1,否则curr [x] = 0

现在将下面给出的函数调用为f(0,0)。 答案将在名为“maxx”的全局变量中, 0最初

 void f(int i,int c)
    {
 // i is the index of current person we are seeing
 // c is the total count of people going till now
    if(i==N)
    {
    if(c>maxx)maxx=c;
    }
    else
    {
    int j,flag=1;
    int sz;
    sz=enemy[i].size();
    if(sz==0)
    {
    //if he has no enemy, he can obviously go
    curr[i]=1;
    f(i+1,c+1);
    }
    else
    {
    for(j=0;j<sz;j++)
    if(curr[enemy[i][j]]==1)
      {
        //if his enemy is already going, he cannot 
        flag=0;
        break;
      }
    if(flag)
    {
     //if none of his enemies till now are going, he can
    curr[i]=1;
    f(i+1,c+1);
    }
    curr[i]=0;
    f(i+1,c);//we will also see what if we dont take him
    }
    }

答案 2 :(得分:1)

尝试制作对抗图,​​然后找到largest independent set。 (警告:这个问题是NP)