【搜索算法】部落卫队


题目描述
原始部落byteland中的居民们为了争夺有限的资源,经常发生冲突。几乎每个居民都有他的仇敌。部落酋长为了组织一支保卫部落的队伍,希望从部落的居民中选出最多的居民入伍,并保证队伍中任何2 个人都不是仇敌。 给定byteland部落中居民间的仇敌关系,编程计算组成部落卫队的最佳方案。
输入
第1行有2个正整数n和m,表示byteland部落中有n个居民 (n<=100),居民间有m个仇敌关系。接下来的m行中,每行有2个正整数u和v,表示居民u与居民v是仇敌。(居民编号为1,2,…,n)
输出
第1行是部落卫队的最多人数。第2行是卫队组成xi,1<=i<=n,xi=0表示居民i不在卫队中,xi=1表示居民i在卫队中。

样例输入
7 10
1 2
1 4
2 4
2 3
2 5
2 6
3 5
3 6
4 5
5 6
样例输出
3
1 0 1 0 0 0 1


题目分析
本题目适合使用深度优先搜索的算法,类似于八皇后问题,但是也有区别。每选择一次就要改变多个元素的可用性,并且读入时需要进行特殊处理。
我们可以先定义一个结构体(vellager)用于保存每位居民的仇敌关系。再定义3个bool数组:该居民是否可以入伍(can),已经入伍的居民(use),答案(end)。然后读入时将对应的居民划为仇敌关系。
定义一个void函数(flag)其中有两个形参:正在被判断是否可以入伍的居民编号(x),入伍居民的总个数(tot)。先设置边界:当判断的居民编号已经超出了总人数,所有的入伍就结束了,此时比较入伍的人数与之前答案中入伍的人数,若更大,则将此时的use复制到答案end。若没有入伍完毕,则判断该居民是否可以入伍(can)以及是否入伍过(use),若满足条件则改变can和use的值,注意因为一次改变了多个can的值,可以通过再定义一个数组now暂时保存can的副本再改变can。进行下一次搜索flag(x+1,tot+1)。搜索结束后回溯。注意还要尝试当前居民不入伍的情况,即flag(x+1,tot)。


程序样例:

#include<cstdio>
#include<cstring>
struct vellager
{int other[105],s;
} vec[105];
int m,n,send;
bool can[105],use[105],end[105];
void flag(int x,int tot)
{if(x>n){if(tot>send){send=tot;memcpy(end,use,n+1);}return;}if(!can[x] && !use[x]){use[x]=true;bool now[105];memcpy(now,can,n+1);for(int j=0;j<vec[x].s;j++)can[vec[x].other[j]]=true;flag(x+1,tot+1);use[x]=false;memcpy(can,now,n+1);}flag(x+1,tot);
}
int main()
{scanf("%d%d",&n,&m);for(int i=0;i<m;i++){int x,y;scanf("%d%d",&x,&y);if(!vec[x].other[0]) vec[x].s=0;if(!vec[y].other[0]) vec[y].s=0;vec[x].other[vec[x].s++]=y;vec[y].other[vec[y].s++]=x;}flag(1,0);printf("%d\n",send);for(int i=1;i<=n;i++)i-1? printf(" %d",end[i]):printf("%d",end[i]);return 0;
}

练习题讲解-【搜索算法】部落卫队相关推荐

  1. 部落卫队问题 (回溯)

    原始部落byteland中的居民们为了争抢有限的资源,经常发生冲突.几乎每个居民都有它的仇敌.部落酋长为了组织一支保卫部落的队伍,希望从部落的居民中选出最多的居民入伍,并保证队伍中任何两个人都不是仇敌 ...

  2. CCF中学生计算机程序设计入门篇练习题讲解

    CCF中学生计算机程序设计入门篇练习题讲解 全部代码下载地址在文末链接 1.温度转换(10001) 2.三角形面积(1002) 3. 猜数游戏(1003) 4.矩形填充(1004) 5.存款收益(10 ...

  3. 部落卫队 2281

    部落卫队Time Limit:10000MS Memory Limit:65536K Total Submit:244 Accepted:166 Case Time Limit:1000MS Desc ...

  4. 【9505】部落卫队

    Time Limit: 1000ms second Memory Limit: 32m 问题描述: 原始部落byteland中的居民们为了争夺有限的资源,经常发生冲突.几乎每个居民都有他的仇敌.部落酋 ...

  5. 部落卫队 (回溯搜索)

    部落卫队 [问题描述] 原始部落byteland中的居民们为了争夺有限的资源,经常发生冲突.几乎每个居民都有他的仇敌.部落酋长为了组织一支保卫部落的队伍,希望从部落的居民中选出最多的居民入伍,并保证队 ...

  6. (Java实现) 最大团问题 部落卫队

    首先介绍下最大团问题: 问题描述:给一个无向图G=(V,E) ,V是顶点集合,E是边集合.然后在这顶点集合中选取几个顶点,这几 个顶点任意两个之间都有边在E中.求最多可以选取的顶点个数.这几个顶点就构 ...

  7. 部落卫队 解题报告

    部落卫队 [问题描述]        原始部落byteland中的居民们为了争夺有限的资源,经常发生冲突.几乎每个居民都有他的仇敌.部落酋长为了组织一支保卫部落的队伍,希望从部落的居民中选出最多的居民 ...

  8. 5-3 部落卫队问题 (25 分)

    原始部落byteland中的居民们为了争抢有限的资源,经常发生冲突.几乎每个居民都有它的仇敌.部落酋长为了组织一支保卫部落的队伍,希望从部落的居民中选出最多的居民入伍,并保证队伍中任何两个人都不是仇敌 ...

  9. 最大团问题实例--部落卫队问题实现

    首先介绍下最大团问题: 问题描述:给一个无向图G=(V,E) ,V是顶点集合,E是边集合.然后在这顶点集合中选取几个顶点,这几 个顶点任意两个之间都有边在E中.求最多可以选取的顶点个数.这几个顶点就构 ...

最新文章

  1. 数据结构和算法 -- 学习导图
  2. Sitemesh排除Exclude不装饰特定页面的解决办法
  3. c++:MFC _cstring.h库常用函数
  4. Mac-安装Homebrew报错error: could not lock config file .git/config:
  5. RDD、DataFrame和DataSet
  6. java小数换成字符实现加法_第一、二次笔记总结
  7. 计算机基础知识必刷,《2019年江苏专转本考试-计算机基础必刷题题库(第四章)》...
  8. 检测SQL注入式攻击代码
  9. windows 编程 —— 子窗口 与 子窗口控件
  10. AIML应答机器人(一)aiml简介
  11. CRC校验关键点说明(内附C语言CRC校验库)
  12. Leetcode|DFS|130. 被围绕的区域
  13. Help Hanzo(LightOJ - 1197)(欧拉筛 + 思维)
  14. 线性代数系列(1)行列式
  15. PHP导出word【 直接生成word文件 】
  16. 大数据在各领域应用之销量预测
  17. matlab scatter 散点图画法
  18. 利用Python快速绘制海报级别地图
  19. 路由器至游戏服务器稳定性,如何改善路由器到游戏服务器的
  20. 免费获取歌词API 可下载歌词

热门文章

  1. 高中数学数列解题方法(定义与性质)
  2. CSS(Cascading Style Sheet)
  3. r语言热图太大卡死怎么办_R语言学习 – 热图绘制 (heatmap)
  4. 心想-行动-事成——刘成林研究员在自动化所2013届研究生毕业典礼上的讲话
  5. 芝村乡如何从零开始学习理财
  6. Python爬虫学习第1天丨从零开始初识爬虫
  7. NVisual网络可视化工具——智能推荐链路
  8. “5G 将是一个彻底的失败通信技术” | 畅言
  9. JavaScript使用 nullish coalescing operator(空值合并操作符??)导致部分Android手机打不开H5页面的解决方法
  10. sas导出txt文件分隔符