#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
const int MAX = 50;
int enemy[MAX][MAX]; //enemy[i][j]=1 表示i, j之间有仇敌关系
int m, n;
int k; //部落卫队中的人数
int bestk = 0;
int x[MAX]; //被选情况
int bestx[MAX];
bool ok(int j)
{
for(int i=1; i<j; i++)
if(x[j]==1 && x[i]==1 && enemy[i][j]==1) //第i,j人都被选,且两人有仇敌关系
return false; //不符合条件
return true;
}
void compute()
{
k = 0; //被选人数
for(int i=1; i<=n; i++)
{
if(x[i] == 1) //被选
k++;
}
if(k > bestk)
{
bestk = k;
copy(x, x+n+1, bestx);
}
}
void backtrack(int dep)
{
if(dep > n)
{
compute();
return;
}
for(int i=0; i<2; i++)
{
x[dep] = i;
if(ok(dep))
backtrack(dep+1);
x[dep] = 0;
}
}
int main()
{
ifstream fin("部落卫队.txt");
cout << "输入部落居民数:";
fin >> n; cout << n << endl;
cout << "输入仇敌关系数:";
fin >> m; cout << m << endl;
cout << "输入仇敌关系:\n";
int a, b;
memset(enemy, 0, sizeof(enemy));
for(int i=1; i<=m; i++)
{
fin >> a >> b;
cout << a << " " << b << endl;
enemy[a][b] = 1;
enemy[b][a] = 1;
}
memset(x, 0, sizeof(x));
backtrack(1);
cout << "部落卫队最多人数为:" << bestk << endl;
cout << "被选情况为:\n";
for(i=1; i<=n; i++)
cout << bestx[i] << " ";
cout << endl;
cout << endl;
fin.close();
return 0;
}
部落卫队问题
最新推荐文章于 2021-12-10 16:20:19 发布