部落卫队问题(深度优先搜索)
来源:互联网 发布:java如何停止一个线程 编辑:程序博客网 时间:2024/04/27 20:22
Description
原始部落byteland中的居民们为了争夺有限的资源,经常发生冲突。几乎每个居民都有他的仇敌。部落酋长为了组织一支保卫部落的队伍,希望从部落的居民中选出最多的居民入伍,并保证队伍中任何2个人都不是仇敌。
.编程任务:
给定byteland部落中居民间的仇敌关系,编程计算组成部落卫队的最佳方案。
Input
第1行有2个正整数n(n<=100)和m,表示byteland部落中有n位居民,居民间有m个仇敌关系。居民编号为1,2,…,n。接下来的m行中,每行有2个正整数u和v,表示居民u与居民v是仇敌。
Output
第1行是部落卫队的顶人数;
第2行是卫队组成xi ,1 ≤ i ≤ n ,xi=0 表示居民i不在卫队中,xi =1表示居民i在卫队中。
Sample Input
7 10 3 1 2 1 0 1 0 0 0 1 1 4 2 4 2 3 2 5 2 6 3 5 3 6 4 5 5 6
Sample Output
3 1 0 1 0 0 0 1
解题思路:用多个数组储存仇敌关系、选择方案,并且用搜索,如果现在的人数大于最大的人数就更新最大人数,然后循环,如果该人不在卫队里就把它放进去,继续搜索,最后输出总数,并且输出0或1 。
代码:
type
ss=set of 1..100;
var
a:array[1..1000] of integer;
s,c:array[1..1000] of boolean;
b:array[1..1000] of ss;
i,j,k,n,max,ren,x,y:integer;
sss:ss;
procedure dfs(now,t:integer;sss:ss);
var
i:integer;
begin
if now>max then begin max:=now; s:=c; end;
for i:=t+1 to n do
if not(i in sss) then
begin
c[i]:=true;
dfs(now+1,i,sss+b[i]);
c[i]:=false;
end;
end;
begin
fillchar(c,sizeof(c),false);
sss:=[];
readln(n,k);
ren:=0; max:=0;
for i:=1 to k do
begin
readln(x,y);
b[x]:=b[x]+[y];
end;
sss:=[];
dfs(0,0,sss);
writeln(max);
for i:=1 to n do
if s[i] then write(1,' ')
else write(0,' ');
end.
0 0
- 部落卫队问题(深度优先搜索)
- 部落卫队问题
- 部落卫队问题
- 部落卫队问题
- 【深度优先搜索】种族部落
- 【2016普及组模拟考试】04 搜索 tribe(部落卫队)
- 练习题讲解-【搜索算法】部落卫队
- 部落卫队
- 部落卫队
- 部落卫队问题(分支限界法)
- 深度优先搜索(POJ1164 城堡问题)
- 深度优先搜索DFS(迷宫问题)
- 装载问题(深度优先搜索)
- 背包问题(深度优先搜索解法)
- 迷宫问题(深度优先搜索)
- 最大团问题实例--部落卫队问题实现
- 部落卫队 解题报告
- 【9505】部落卫队
- 名企动态网站开发--jQuery实现flash动画效果
- Oracle RAC 单节点宕机 has a disk HB, but no network HB
- 两个树结点的公共祖先
- Windows10 Linux bash安装问题
- 细胞问题(广度优先搜索)
- 部落卫队问题(深度优先搜索)
- 拦截导弹问题(贪心算法)
- Oliver的救援(广度优先搜索)
- 翻币问题(广度优先搜索)
- 家庭问题(广度优先搜索)
- 计算问题(栈)
- ACM程序设计选修课——1076汇编语言(重定向+模拟)
- 括弧匹配检验(栈)
- 装载问题(深度优先搜索)