部落卫队问题

部落卫队问题描述:

原始部落中的居民为了争夺资源,常发生冲突。几乎每个居民都有仇敌。酋长为了组织一个部落卫队,希望

从部落居民中选出最多的居民入伍,并保证队伍中任何2个人都不是仇敌。

编程任务:

根据给定的居民间的仇敌关系,编程计算出部落卫队的最佳方案。

数据输入:

第1行2个整数n,m表示部落中居民个数,居民中有m个仇敌关系。居民编号1,2,...,n。接下来m行,每行2

个整数u,v表示居民u和v是仇敌。

输入实例:

7 10
1 2
1 4
2 4
2 3
2 5
2 6
3 5
3 6
4 5
5 6

输出实例:

3


实现代码:

#include <iostream>
#include <vector>
#include <string>
using namespace std;
int totalpeople = 100,best=0,totalrelation;   //假设部落最多有100个人,相互之间的敌对关系最多为100组
vector<int>markvisit(totalpeople+1,0);    //标记此人是否已经被选上(1:选上,0:不选)
vector<vector<int> > relation(totalpeople+1 ,vector<int>(totalpeople+1,0));  //记录冲突的人的编号
void select(int start,int wantselect,int selected)  // select(开始挑选的人的编号,希望挑选的人的数量,已挑选的人的数量)
{
    if(selected+totalpeople-wantselect<best)
    {
        return;
    }
    if(selected==wantselect)  //如果已挑选wantselect人,则判断挑选的人是否存在冲突
    {
        vector<int>tmpselected;
        for(int i=1;i<=totalpeople;i++)
        {
            if(markvisit[i]==1)
            {
                tmpselected.push_back(i);
            }
        }
        bool mark=false;
        for(int j=0;j<tmpselected.size();j++)
        {
            for(int k=j+1;k<tmpselected.size();k++)
            {
                if(relation[tmpselected[j]][tmpselected[k]]==1)
                {
                    mark=true;
                    break;
                }
            }
            if(mark)
            {
                break;
            }
        }
        if(!mark)
        {
            if(selected>best)  //如果不冲突,判断此时是否优于之前最优解
            {
                best=selected;
            }
        }
        tmpselected.clear();
    }
    for(int j=start; j<=totalpeople; j++)  //如果人数没达到预期,则接着挑选
    {
        if(markvisit[j]==0)             //如果此人没被选,则选上
        {
            markvisit[j]=1;
            select(j+1,wantselect,selected+1);  //向下接着挑选
            markvisit[j]=0;
        }
    }
}
int main()
{
    int tmpx,tmpy;
    cin>>totalpeople>>totalrelation;
    for(int i=1; i<=totalrelation; i++)
    {
        cin>>tmpx>>tmpy;
        relation[tmpx][tmpy]=1;
        relation[tmpy][tmpx]=1;
    }
    for(int j=1; j<=totalpeople; j++)
    {
        select(1,j,0);
    }
    cout << best << endl;
    return 0;
}




你可能感兴趣的:(算法,cc++)