ImageVerifierCode 换一换
格式:DOCX , 页数:28 ,大小:47.41KB ,
资源ID:12052249      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/12052249.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(pascal教程5图.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

pascal教程5图.docx

1、pascal教程5图第五章 图5.1 医院设置源程序名 hospital.*(pas, c, cpp)可执行文件名 hospital.exe输入文件名 hospital.in输出文件名 hospital.out【问题描述】 设有一棵二叉树,如图5-1: 1 / 2 3 / 4 5 其中,圈中的数字表示结点中居民的人口。圈边上数字表示结点编号,现在要求在某个结点上建立一个医院,使所有居民所走的路程之和为最小,同时约定,相邻接点之间的距离为l。如上图中,若医院建在:【输入】 第一行一个整数n,表示树的结点数。(n100) 接下来的n行每行描述了一个结点的状况,包含三个整数,整数之间用空格(一个或多

2、个)分隔,其中:第一个数为居民人口数;第二个数为左链接,为0表示无链接;第三个数为右链接。【输出】 一个整数,表示最小距离和。【样例】 hospital.in hospital.out 5 81 13 2 3 4 0 0 12 4 5 20 0 0 40 0 0【知识准备】 图的遍历和最短路径。【算法分析】 本题的求解任务十分明了:求一个最小路径之和。 根据题意,对n个结点,共有n个路径之和:用记号Si表示通向结点i的路径之和,则,其中Wj为结点j的居民数,g(i,j)为结点j到结点i的最短路径长度。下面表中反映的是样例的各项数据:jg(i,j)i12345Si101122013+14+112

3、+220+240=136210233113+04+212+320+340=217312011113+24+012+120+140=81423102213+34+112+020+240=130523120213+34+112+220+040=90 从表中可知S3=81最小,医院应建在3号居民点,使得所有居民走的路径之和为最小。 由此可知,本题的关键是求gi,j,即图中任意两点间的最短路径长度。 求任意两点间的最短路径采用下面的弗洛伊德(Floyd)算法。 (1)数据结构: w:array1.100of longing; 描述个居民点人口数 g:array1.100, 1.100of longin

4、t 初值为图的邻接矩阵,最终为最短路径长度 (2)数据的读入: 本题数据结构的原形为二叉树,数据提供为孩子标识法,分支长度为1,建立带权图的邻接矩阵,分下面两步: gi,jMax Max为一较大数,表示结点i与j之间无直接相连边 读入n个结点信息: for i:=1 to n do begin gi,j:=0; readln(wi,l,r); if l0 then begin gi,l:=l; gl,i:=l end; if r0 then begin gi,r:=l; gr,i:=l end; (3)弗洛伊德算法求任意两点间的最短路径长度 for k:=1 to n do for i:=1

5、to n do if ik then for j:=1 to n do if (ij)and(kj)and(gi,k+gk,jgi,j) then gi,j:=gi,k+gk,j; (4)求最小的路程和min min:=max longint; for i:=1 to n do begin sum:=0; for j:=1 to n do sum:=sum+wi*gi,j; if sumb,则highi=highj+b(根据TiTj+b), 若lowi-lowjb,则lowjlowi-b(根据TiTi-b)。 以上的调整终止视下列两种情况而定: (1)对所有的不等式Ti-Tjb,不再有high

6、i或lowj的调整; (2)若存在highilowi或highjb) then begin highi:=highj+b; flag:=true; end; 调整Ti的上界 if (lowi-lowjb) then begin lowj:=lowi-b; flag:=true; end; 调整Tj的下界 if (lowihighi) or (lowjhighj) then begin 无法满足当前不等式,则调整终止 noans:=true; 问题无解noans=true flag:=false; break; end; end; end; 下面以样例说明:【样例1】 8个不等式如下序号1234

7、5678i11234455j25511334b0-1154-1-3-3 顶点的关键值Ti的调整记录:初值第1轮调整第2轮调整第3轮调整high10000low10000high210000010000022low2-10000222high3100000555low3-10000455high4100000444low4-10000444high5100000111low5-10000111调整状态有变化有变化无变化【样例2】 5个不等式如下编号12345i11254j25511b-3-1-1-54 顶点关键值Ti的调整记录: 初值第一轮调整第二轮调整1high00low002high1000

8、0099999low-1000033high10000010000low-10000-100004high1000004low-10000-100005high100000-5low-100001调整情况high5T1 T2-T5-1,T5T2 T5-T1-5,T1T5 这三个不等式不能同时成立,因此问题无解。5.3 服务器储存信息问题源程序名 servers.?(pas, c, cpp)可执行文件名 servers.exe输入文件名 servers.in输出文件名 servers.out【问题描述】 Byteland王国准备在各服务器间建立大型网络并提供多种服务。 网络由n台服务器组成,用双

9、向的线连接。两台服务器之间最多只能有一条线直接连接,同时,每台服务器最多只能和10台服务器直接连接,但是任意两台服务器间必然存在一条路径将它们连接在一起。每条传输线都有一个固定传输的速度。(V, W)表示服务器V和W之间的最短路径长度,且对任意的V有(V, V)0。 有些服务器比别的服务器提供更多的服务,它们的重要程度要高一些。我们用r(V)表示服务器V的重要程度(rank)。rank越高的服务器越重要。 每台服务器都会存储它附近的服务器的信息。当然,不是所有服务器的信息都存,只有感兴趣的服务器信息才会被存储。服务器V对服务器W感兴趣是指,不存在服务器U满足,r(U)r(W)且(V, U)(V

10、, W)。 举个例子来说,所有具有最高rank的服务器都会被别的服务器感兴趣。如果V是一台具有最高rank的服务器,由于(V, V)0,所以V只对具有最高rank的服务器感兴趣。我们定义B(V)为V感兴趣的服务器的集合。 我们希望计算所有服务器储存的信息量,即所有服务器的|B(V)|之和。Byteland王国并不希望存储大量的数据,所以所有服务器存储的数据量(|B(V)|之和)不会超过30n。 你的任务是写一个程序,读入Byteland王国的网络分布,计算所有服务器存储的数据量。【输入】 第一行两个整数n和m,(1n30000,1m5n)。n表示服务器的数量,m表示传输线的数量。 接下来n行,

11、每行一个整数,第i行的整数为r(i)(1r(i)10),表示第i台服务器的rank。 接下来m行,每行表示各条传输线的信息,包含三个整数a,b,t(1t1000,1a,bn,ab)。a和b是传榆线所连接的两台服务器的编号,t是传输线的长度。【输出】 一个整数,表示所有服务器存储的数据总量,即|B(V)|之和。【样例】 servers.in servers.out 4 3 9 2 3 1 1 1 4 30 2 3 20 3 4 20注:B(1)=1,2,B(2)=2,B(3)=2,3,B(4)=1,2,3,4。【知识准备】 Dijkstra算法,及其O(n+e)log2n)或O(nlog2n+e

12、)的实现。【算法分析】 本题的难点在于问题的规模。如果问题的规模在100左右,那么这将是一道非常容易的题目。因为O(n3)的算法是很容易想到的: (1)求出任意两点间的最短路径,时间复杂度为O(n3); (2)枚举任意两点,根据定义判断一个节点是否对另一个节点感兴趣,时间复杂度为O(n3)。 当然,对于30000规模的本题来说,O(n3)的算法是绝对不可行的,即便降到O(n2)也不行,只有O(nlog2n)或O(n)是可以接受的。 既然现在可以得到的算法与要求相去甚远,要想一鼓作气得到一个可行的算法似乎就不是那么容易了。我们不妨先来看看我们可以做些什么。 判断一个节点V是否对节点W感兴趣,就是

13、要判断是否存在一个rank大于r(W)的节点U,(V, U)(V, r(W)+1)。如果是以W为起点,用Dijkstra算法求最短路径的话。当扩展到V时,发现V对W不感兴趣,即(V, W)(V, r(W)+1)。那么,如果再由V扩展求得到U的最短路径,则: (U, W)=(V, W)+(U, V), (U, r(W)+1)=(V, r(W)+1)+(U, V), 由于(V, W)(V, r(W)+1), 所以(V, W)+(U, V)(V, r(W)+1)+(U, V),即(U, W)(U, r(W)+1) 所以,U对W也不感兴趣。因此,如果以W为起点,求其他点到W的最短路径,以判断其他点是否

14、对W感兴趣,当扩展到对W不感兴趣的节点时,就可以不继续扩展下去了(只扩展对W感兴趣的节点)。 我们知道,所有感兴趣的点对不超过30n。因此,以所有点作起点,用Dijkstra算法求最短路径的时间复杂度可由平摊分析得为O(30(n+e)log2n)=O(30(n+5n)log2n)=O(nlog2n)。 由此,我们看到判断一节点是否对另一节点感兴趣,两个关键的步骤都可以在O(nlog2n)时间内完成。当然算法的系数是很大的,不过由于n不大,这个时间复杂度还是完全可以承受的。下面就总结一下前面得到的算法: (1)分别以rank=1, 2, , 10的节点(集合)作为起点,求该节点(集合)到所有点的

15、最短距离(其实也就是所有点到该节点(集合)的最短距离); (2)以每个点作为起点,求该点到所有点的最短距离。当求得某节点的最短距离的同时根据求得的最短距离和该节点到rank大于起点的节点(集合)的最短距离,判断该节点是否对起点感兴趣。如果感兴趣,则找到一对感兴趣的点对,否则,停止扩展该节点,因为该节点不可能扩展出对起点感兴趣的节点。 总结解题的过程,可以发现解决本题的关键有三点:一是稀疏图,正因为图中边比较稀疏所以我们可以用Dijkstra+Priority Queue的方法将求最短路径的时间复杂度降为O(nlog2n);二是rank的范围很小,rank的范围只有10,所以我们只用了10次Di

16、jkstra算法就求得了所有点到特定rank的最短距离;三是感兴趣的点对只有很少,由于感兴趣的点对只有30n,我们通过只计算感兴趣点对的最短路径,将求点与点间最短路径的时间复杂度降到了O(nlog2n)。这三点,只要有一点没有抓住。本题就不可能得到解决。5.4 间谍网络(AGE)源程序名 age.?(pas, c, cpp)可执行文件名 age.exe输入文件名 age.in输出文件名 age.out【问题描述】 由于外国间谍的大量渗入,国家安全正处于高度的危机之中。如果A间谍手中掌握着关于B间谍的犯罪证据,则称A可以揭发B。有些间谍收受贿赂,只要给他们一定数量的美元,他们就愿意交出手中掌握的

17、全部情报。所以,如果我们能够收买一些间谍的话,我们就可能控制间谍网中的每一分子。因为一旦我们逮捕了一个间谍,他手中掌握的情报都将归我们所有,这样就有可能逮捕新的间谍,掌握新的情报。 我们的反间谍机关提供了一份资料,色括所有已知的受贿的间谍,以及他们愿意收受的具体数额。同时我们还知道哪些间谍手中具体掌握了哪些间谍的资料。假设总共有n个间谍(n不超过3000),每个间谍分别用1到3000的整数来标识。 请根据这份资料,判断我们是否有可能控制全部的间谍,如果可以,求出我们所需要支付的最少资金。否则,输出不能被控制的一个间谍。【输入】 输入文件age.in第一行只有一个整数n。 第二行是整数p。表示愿

18、意被收买的人数,1pn。 接下来的p行,每行有两个整数,第一个数是一个愿意被收买的间谍的编号,第二个数表示他将会被收买的数额。这个数额不超过20000。 紧跟着一行只有一个整数r,1r8000。然后r行,每行两个正整数,表示数对(A, B),A间谍掌握B间谍的证据。【输出】 答案输出到age.out。 如果可以控制所有间谍,第一行输出YES,并在第二行输出所需要支付的贿金最小值。否则输出NO,并在第二行输出不能控制的间谍中,编号最小的间谍编号。【样例1】 age.in age.out 3 YES 2 110 1 10 2 100 2 1 3 2 3【样例2】 age.in age.out 4 NO 2 3 1 100 4 200 2 1 2 3 4【算法分析】 根据题中给出的间谍的相互控制关系,建立有向图。找出有向图中的所有强连通分量,用每个强连通分量中最便宜的点

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1