数据结构中图结构的最小生成树算法(普里姆算法)

数据结构中图结构的最小生成树算法(普里姆算法)
最近有很久都没有露头了,主要是有很多的作业,而且马上就到了期末考试了,所以我没有什么时间来这里发布文章了。今天呢,把我以前写的图结构再次搬了上来。这次的图结构添加了广度优先遍历,和最小生成树的普里姆算法。现在我就把我程序中的普里姆算法贴出来,供大家参考。

Code:
  1. /*----------------------------------------------------------------------------
  2. 蒋轶民制作:E-mail:jiangcaiyang123@163.com
  3. ------------------------------------------------------------------------------
  4. 文件名:JGraph_MiniSpanTree.h
  5. ------------------------------------------------------------------------------
  6. 作用:最小生成树的生成
  7. ------------------------------------------------------------------------------
  8. 调用规范:无
  9. /*--------------------------------------------------------------------------*/
  10. //条件编译
  11. #ifndef_JGRAPH_MINISPANTREE_H_
  12. #define_JGRAPH_MINISPANTREE_H_
  13. /*--------------------------------------------------------------------------*/
  14. //返回顶点在图中的位置
  15. template<typenameCustomType>
  16. intJMatrixGraph<CustomType>::LocateVex(CustomTypeu)
  17. {
  18. inti;
  19. for(i=0;i<vexnum;i++)
  20. {
  21. if(vexs[i]==u)
  22. returni;
  23. }
  24. return-1;
  25. }
  26. /*--------------------------------------------------------------------------*/
  27. //输出最小边的下标
  28. template<typenameCustomType>
  29. intJMatrixGraph<CustomType>::minimum(CloseEdge<CustomType>*closedge)
  30. {
  31. inti,track_i=-1;
  32. VRTypelowestcost=INFINITY;
  33. for(i=0;i<vexnum;i++)
  34. {
  35. if(lowestcost>closedge[i].lowcost&&closedge[i].lowcost>0)
  36. {
  37. lowestcost=closedge[i].lowcost;
  38. track_i=i;
  39. }
  40. }
  41. returntrack_i;
  42. }
  43. /*--------------------------------------------------------------------------*/
  44. //普里姆算法求最小生成树
  45. template<typenameCustomType>
  46. voidJMatrixGraph<CustomType>::MiniSpanTree_PRIM(CustomTypeu)
  47. {
  48. CloseEdge<CustomType>closedge[MAX_VERTEX_NUM];
  49. inti,j,k;
  50. /*-------------------------------------*/
  51. #ifdef_JDEBUG_//调试版本的
  52. cout<<"邻接矩阵为:/n";
  53. for(i=0;i<vexnum;i++)
  54. {
  55. for(j=0;j<vexnum;j++)
  56. {
  57. if(arcs[i][j].adj==INFINITY)
  58. cout<<"∞";
  59. elsecout<<arcs[i][j].adj<<"";
  60. }
  61. cout<<'/n';
  62. }
  63. #endif
  64. /*-------------------------------------*/
  65. k=LocateVex(u);//寻找u顶点在邻接矩阵的位置,并让其为k
  66. if(k==-1)
  67. {
  68. cout<<"调用LocateVex()函数失败。"<<'/n';
  69. return;
  70. }
  71. for(j=0;j<vexnum;j++)
  72. {
  73. if(j!=k)
  74. {
  75. closedge[j].adjvex=u;
  76. closedge[j].lowcost=arcs[k][j].adj;
  77. }
  78. }
  79. /*-------------------------------------*/
  80. #ifdef_JDEBUG_//调试版本的
  81. cout<<"遍历最短边结构体的集合:/n";
  82. for(i=0;i<vexnum;i++)
  83. {
  84. cout<<i+1<<'/n';
  85. cout<<"adjvex:"<<closedge[i].adjvex<<'/n';
  86. cout<<"lowcost:"<<closedge[i].lowcost<<'/n';
  87. }
  88. #endif
  89. /*-------------------------------------*/
  90. closedge[k].lowcost=0;//初始化,U={u}
  91. for(i=1;i<vexnum;i++)
  92. {
  93. k=minimum(closedge);
  94. if(k==-1)
  95. {
  96. cout<<"输出最小边的下标(调用minimum()函数)失败。/n";
  97. return;
  98. }
  99. cout<<closedge[k].adjvex<<"→"<<vexs[k]<<'';
  100. closedge[k].lowcost=0;
  101. for(j=0;j<vexnum;j++)
  102. {
  103. if(arcs[k][j].adj<closedge[j].lowcost)
  104. {
  105. closedge[j].adjvex=vexs[k];
  106. closedge[j].lowcost=arcs[k][j].adj;
  107. }
  108. }
  109. }
  110. cout<<'/n';
  111. }
  112. /*--------------------------------------------------------------------------*/
  113. #endif

这是我的图结构的主结构。在这里我定义了一个图结构类,并把实现的细节都分散在各个文件中。由于篇幅的原因,就没有列出来了。

Code:
  1. /*----------------------------------------------------------------------------
  2. 蒋轶民制作:E-mail:jiangcaiyang123@163.com
  3. ------------------------------------------------------------------------------
  4. 文件名:JGraph.h
  5. ------------------------------------------------------------------------------
  6. 作用:这是使用邻接矩阵制作的图状结构,基本实现了图的创建操作、深度优先搜索和广
  7. 度优先搜索。
  8. ------------------------------------------------------------------------------
  9. 调用规范:
  10. /*--------------------------------------------------------------------------*/
  11. //条件编译
  12. #ifndef_JGRAPH_H_
  13. #define_JGRAPH_H_
  14. /*--------------------------------------------------------------------------*/
  15. //头文件
  16. #include<iostream>
  17. #include<limits.h>
  18. usingnamespacestd;
  19. //定义的宏
  20. #defineINFINITYINT_MAX
  21. #defineMAX_VERTEX_NUM20
  22. /*--------------------------------------------------------------------------*/
  23. //定义一系列类型
  24. enumGraphKind{DG,DN,UDG,UDN};//图的类型枚举
  25. typedefunsignedintVRType;
  26. typedefcharInfoType;
  27. typedefstruct
  28. {
  29. VRTypeadj;//顶点关系类型
  30. InfoType*info;//弧的信息
  31. }AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
  32. //求最短路径的辅助结构体
  33. template<typenameCustomType>
  34. structCloseEdge
  35. {
  36. CustomTypeadjvex;
  37. VRTypelowcost;//顶点关系类型
  38. };
  39. //图的定义
  40. template<typenameCustomType>
  41. classJMatrixGraph
  42. {
  43. public:
  44. JMatrixGraph():vexnum(0),arcnum(0){}//默认构造函数
  45. voidCreateGraph(GraphKindinputKind);//创建图
  46. voidDFSTraverse(bool(*Visit)(intv));//深度优先搜索遍历
  47. voidBFSTraverse(bool(*Visit)(intv));//广度优先搜索遍历
  48. intGetVertexNum(void){returnvexnum;};//返回顶点个数
  49. intGetArcNum(void){returnarcnum;}//返回弧的个数
  50. CustomTypeGetvexs(inti){returnvexs[i];}//返回顶点信息
  51. voidSearchNonZeroInMatrix(int&v,int&w);//从当前下标开始以下三角(◣)方式查找下一个非零矩阵元素
  52. voidMiniSpanTree_PRIM(CustomTypeu);//普里姆算法求最小生成树
  53. /*--------------------------------------*/
  54. //临时用来测试输出的示例图结构
  55. #ifdef_JDEBUG_
  56. #include"JGraph/JGraph_Debug.h"
  57. #endif
  58. /*--------------------------------------*/
  59. private:
  60. voidCreateDG(void);//创建有向图
  61. voidCreateDN(void);//创建有向网
  62. voidCreateUDG(void);//创建无向图
  63. voidCreateUDN(void);//创建无向网
  64. voidDepthFirstSearch(intv,bool(*Visit)(intv));//深度优先搜索
  65. intFirstAdjVex(intv);//返回第v个顶点的第一个邻接点
  66. intNextAdjVex(intv,intw);//返回第v个顶点的下一个邻接点
  67. intLocateVex(CustomTypeu);//寻找u顶点在邻接矩阵的位置
  68. intminimum(CloseEdge<CustomType>*closedge);//在CloseEdge结构体中寻找最短的边
  69. CustomTypevexs[MAX_VERTEX_NUM];//顶点向量
  70. AdjMatrixarcs;//邻接矩阵
  71. intvexnum,arcnum;//图的顶点数和弧数
  72. GraphKindkind;//图的种类标志
  73. boolvisited[MAX_VERTEX_NUM];//访问标志数组
  74. };
  75. /*--------------------------------------------------------------------------*/
  76. //图各种操作的实现
  77. #include"JGraph/JGraph_CreateGraph.h"
  78. #include"JGraph/JGraph_Traverse.h"
  79. #include"JGraph/JGraph_MiniSpanTree.h"
  80. #include"JGraph/JGraph_Direct2DGraph.h"
  81. /*--------------------------------------------------------------------------*/
  82. #endif

程序的截图是:
这是定义了_JDEBUG_的,能显示更多的信息,大家也可以不定义_JDEBUG_,这样就只显示最短路径的信息了。

如果大家想得到所有源码的话,这里有下载:http://download.csdn.net/source/2914075

我还是希望能够把数据结构的图的所有操作做完。这样我也算是完成了一个任务了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值