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