我必须安排一次旅行。有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。
我的方法:
如果有人能给我一个提示或指出一个很好的资源来解决这个问题,我将感激不尽。
答案 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)