士兵排队试题解析.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

【题22】士兵排队

有n个士兵(1≤n≤26),编号依次为A、B、C、??。队列训练时,指挥官要把一些士兵从高到矮依次排成一行。但现在指挥官不能直接获得每个人的身高信息,只能获得“p比p高”这样的比较结果(p,

1 2 1

p∈{’A’‥’Z’}),记为pp。例如AB,BD,FD。士兵的身高关系下图所示

2 1 2

对应的排队方案有三个:AFBD、FABD、ABFD。输入k行,每行为ab,表示ab

输出排队方案

分析:

士兵的身高关系对应一张有向图,图中的顶点对应一个士兵,有向边v,v表示士兵i高于士兵j。

i j

我们按照从高到矮将士兵排出一个线性的顺序关系,即为对有向图的顶点进行拓扑排序。

⑴拓扑序列的定义

拓扑排序是有向图的另一种重要运算。给出有向图G=(V,E)。若顶点的线性序列v’,…,v’(v’∈V,

1 n i

1≤i≤n)满足如下条件:

v’至v ’有一条路径(1≤kn-1)

k k+1

则称该序列为拓扑序列。

一个有向图结点的拓扑序列不是唯一的。并不是任何有向图的顶点都可以排成拓扑序列,有环图是不能排的。例如下图所示的有环图

从其中任何一个结点出发,都可经由其它两个项点返回本身,因此就无法把结点排成满足条件的序列。任何无环的有向图,其结点都可以排出一个拓扑序列。

⑵拓扑序列的计算

下面给出拓扑排序的方法

⑴从图中选择一个入度为0的结点且输出之;

⑵从图中删除该结点及其所有出边(即与之相邻的所有结点的入度减一);

反复执行这两个步骤,直至所有结点都输出了,也就是整个拓扑排序完成了。或者直至剩图中再没有入度为0的结点,这就说明此图中有环,拓扑排序不能再进行下去了。例如

对于士兵排队问题,我们首先构造一张有向图G:var

g:array[’A’‥’Z’,’A’‥’Z’]of0‥1; {图的相邻矩阵}d:array[’A’‥’Z’]ofinteger; {结点的度数序列}s:setof ’A’‥’Z’; {士兵名集合}

图中的结点为士兵。若ab,则g[a,b]←1(即a向b引入一条有向边);计算结点b的入度(即比士兵b

高的人数)d(b)←d(b)+1。显然最高士兵对应的结点入度为0:

s←[]; {士兵名集合初始化}

while 文件未输入完dobegin

读ab信息;

if(a∈{’A’‥’Z’})and(b∈{’A’‥’Z’})

thenbegin

s←s+[a,b]; {计算士兵名集合}

g[a,b]←1; {构造有向边(a,b)}

d[b]←d[b]+1; {累计结点b的入度}

end;{then}end;{while}

然后通过下述方法计算士兵名字符集m和士兵人数km←’’;

fora=’A’to ’Z’do

ifa sthenm←m+a;k←length(m);

接下来对有向图G作拓扑排序。若图G中有回路,则排队方案不存在;否则拓扑序列n即为一个排队方案。拓扑排序的过程如下:

n←’’; {拓扑序列n初始化为空}

fori:=1tokdo {依次搜索每一个出列士兵}

beginj←1;

while(d[m[j]]0)and(j≤k)doj←j+1; {搜索第i个入度为0的结点序号j}

ifjkthen {若入度为0的结点不存在,则队列不存在最高的士兵,无解退出}thenbegin

输出失败信息;halt;

end;{then}

n←n+m[j] {入度为0的结点j进入拓扑序列n}a←m[j]; d[a]←∞;

forj:=1tokdo {删去结点j}

ifg[a,m[j]]0thend[m[j]]←d[m[j]]-1;end;{for}

输出拓扑序列n;

计算拓扑序列的时间复杂度为W(n2)

文档评论(0)

hao187 + 关注
官方认证
文档贡献者

该用户很懒,什么也没介绍

认证主体武汉豪锦宏商务信息咨询服务有限公司
IP属地上海
统一社会信用代码/组织机构代码
91420100MA4F3KHG8Q

1亿VIP精品文档

相关文档