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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

《算法设计与分析》上机实验报告5.docx

1、算法设计与分析上机实验报告5福州大学数学与计算机科学学院算法设计与分析上机实验报告(5)专业和班级姓名成绩学号实验名称单源最短路径问题实验目的和求1.理解算法设计的基本步骤和各步的主要内容,基本要求2.加深对分支限界法基本思想的理解 3.培养学生用计算机解决实际问题的能力实验任务1.掌握单源最短路径问题的基本算法及其应用2.利用分支限界法找出具体问题的最优解3.分析实验结果,总结算法的时间和空间复杂度实验步骤1. 单源最短路径问题描述下面以一个例子来说明单源最短路径问题:在下图所给的有向图G中,每一边都有一个非负边权。要求图G的从源顶点s到目标顶点t之间的最短路径。2. 算法的设计思想: 解单

2、源最短路径问题的优先队列式分支限界法用一极小堆来存储活结点表。其优先级是结点所对应的当前路长。 算法从图G的源顶点s和空优先队列开始。结点s被扩展后,它的儿子结点被依次插入堆中。此后,算法从堆中取出具有最小当前路长的结点作为当前扩展结点,并依次检查与当前扩展结点相邻的所有顶点。如果从当前扩展结点i到顶点j有边可达,且从源出发,途经顶点i再到顶点j的所相应的路径的长度小于当前最优路径长度,则将该顶点作为活结点插入到活结点优先队列中。这个结点的扩展过程一直继续到活结点优先队列为空时为止。3. 剪枝策略 在算法扩展结点的过程中,一旦发现一个结点的下界不小于当前找到的最短路长,则算法剪去以该结点为根的

3、子树。 在算法中,利用结点间的控制关系进行剪枝。从源顶点s出发,2条不同路径到达图G的同一顶点。由于两条路径的路长不同,因此可以将路长长的路径所对应的树中的结点为根的子树剪去。4. 单源最短路径问题程序代码1、MinHeap2.h1. #include2. 3. template4. classGraph;5. 6. template7. classMinHeap8. 9. template10. friendclassGraph;11. public:12. MinHeap(intmaxheapsize=10);13. MinHeap()deleteheap;14. 15. intSize(

4、)constreturncurrentsize;16. TMax()if(currentsize)returnheap1;17. 18. MinHeap&Insert(constT&x);19. MinHeap&DeleteMin(T&x);20. 21. voidInitialize(Tx,intsize,intArraySize);22. voidDeactivate();23. voidoutput(Ta,intn);24. private:25. intcurrentsize,maxsize;26. T*heap;27. ;28. 29. template30. voidMinHeap

5、:output(Ta,intn)31. 32. for(inti=1;i=n;i+)33. coutai;34. coutendl;35. 36. 37. template38. MinHeap:MinHeap(intmaxheapsize)39. 40. maxsize=maxheapsize;41. heap=newTmaxsize+1;42. currentsize=0;43. 44. 45. template46. MinHeap&MinHeap:Insert(constT&x)47. 48. if(currentsize=maxsize)49. 50. return*this;51.

6、 52. inti=+currentsize;53. while(i!=1&xheapi/2)54. 55. heapi=heapi/2;56. i/=2;57. 58. 59. heapi=x;60. return*this;61. 62. 63. template64. MinHeap&MinHeap:DeleteMin(T&x)65. 66. if(currentsize=0)67. 68. coutEmptyheap!endl;69. return*this;70. 71. 72. x=heap1;73. 74. Ty=heapcurrentsize-;75. inti=1,ci=2;

7、76. while(ci=currentsize)77. 78. if(ciheapci+1)79. 80. ci+;81. 82. 83. if(y=heapci)84. 85. break;86. 87. heapi=heapci;88. i=ci;89. ci*=2;90. 91. 92. heapi=y;93. return*this;94. 95. 96. template97. voidMinHeap:Initialize(Tx,intsize,intArraySize)98. 99. deleteheap;100. heap=x;101. currentsize=size;102

8、. maxsize=ArraySize;103. 104. for(inti=currentsize/2;i=1;i-)105. 106. Ty=heapi;107. intc=2*i;108. while(c=currentsize)109. 110. if(cheapc+1)111. c+;112. if(y=heapc)113. break;114. heapc/2=heapc;115. c*=2;116. 117. heapc/2=y;118. 119. 120. 121. template122. voidMinHeap:Deactivate()123. 124. heap=0;12

9、5. 2、zuiduanlujing.cpp1. /单源最短路径问题分支限界法求解2. #includestdafx.h3. #includeMinHeap2.h4. #include5. #include6. usingnamespacestd;7. 8. ifstreamfin(6d2.txt);9. 10. template11. classGraph12. 13. friendintmain();14. public:15. voidShortesPaths(int);16. private:17. intn,/图G的顶点数18. *prev;/前驱顶点数组19. Type*c,/图G

10、的领接矩阵20. *dist;/最短距离数组21. ;22. 23. template24. classMinHeapNode25. 26. friendGraph;27. public:28. operatorint()constreturnlength;29. private:30. inti;/顶点编号31. Typelength;/当前路长32. ;33. 34. template35. voidGraph:ShortesPaths(intv)/单源最短路径问题的优先队列式分支限界法36. 37. MinHeapMinHeapNodeH(1000);38. MinHeapNodeE;3

11、9. 40. /定义源为初始扩展节点41. E.i=v;42. E.length=0;43. distv=0;44. 45. while(true)/搜索问题的解空间46. 47. for(intj=1;j=n;j+)48. if(cE.ij!=0)&(E.length+cE.ijdistj)49. 50. /顶点i到顶点j可达,且满足控制约束51. distj=E.length+cE.ij;52. prevj=E.i;53. 54. /加入活结点优先队列55. MinHeapNodeN;56. N.i=j;57. N.length=distj;58. H.Insert(N);59. 60.

12、try61. 62. H.DeleteMin(E);/取下一扩展结点63. 64. catch(int)65. 66. break;67. 68. if(H.currentsize=0)/优先队列空69. 70. break;71. 72. 73. 74. 75. intmain()76. 77. intn=11;78. intprev12=0,0,0,0,0,0,0,0,0,0,0,0;79. 80. intdist12=1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000;81. 82. cout单源图的邻接矩阵如下:end

13、l;83. int*c=newint*n+1;84. 85. for(inti=1;i=n;i+)86. 87. ci=newintn+1;88. for(intj=1;jcij;91. coutcij;92. 93. coutendl;94. 95. 96. intv=1;97. GraphG;98. G.n=n;99. 100. G.c=c;101. G.dist=dist;102. G.prev=prev;103. G.ShortesPaths(v);104. 105. cout从S到T的最短路长是:dist11endl;106. for(inti=2;i=n;i+)107. 108. coutprev(i)=previendl;109. 110. 111. for(inti=2;i=n;i+)112. 113. cout从1到i的最短路长是:distiendl;114. 115. 116. for(inti=1;i=n;i+)117. 118. deleteci;119. 120. 121. deletec;122. c=0;123. return0;124. 实验结果 通过上面的结果图可以看出程序能够快速求出单源最短路径问题的最优解.

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

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