Prim 算法

求解方法:

首先将所指定的起点作为已选顶点,然后反复在满足如下条件下的边中选择一条最小边,直到

所有顶点已成为已选顶点为止(选择n-1条边)。

  1. #include "iostream"
  2. using namespace std;
  3.  
  4. typedef char Vertextype;//顶点类型
  5. typedef int Edgetype;//边的权值类型
  6.  
  7. const int maxvex = ;//最大顶点数目
  8. const int infinity = ;//无穷大
  9.  
  10. typedef struct
  11. {
  12. Vertextype vexs[maxvex];//图的定点存储
  13. Edgetype edge[maxvex][maxvex];//图的边
  14. int numVerTex,numEdge;//图的顶点数和边数
  15. }graph;
  16.  
  17. typedef struct{//候选边存储结构
  18. Vertextype vertex;//未选定点对应候选边的另一顶点
  19. int weight;//未选顶点对应候选边的权值
  20. }MinEdgeType;
  21.  
  22. typedef MinEdgeType MinEdgeArray[maxvex];//候选边的结构
  23.  
  24. /*
  25. *图G中是否存在边(v,u)
  26. */
  27. bool have_edge( graph *&g,int v,int u)
  28. {
  29. if(g->edge[v][u]!=infinity)return true;
  30. else return false;
  31. }
  32.  
  33. /*
  34. *初始化顶点v0候选边集
  35. */
  36. int Init_MinEdges(graph *&g,MinEdgeArray &MinEdges,int v0)
  37. {
  38. int i;
  39. for(i=;i<g->numVerTex;i++)//初始化每个未选顶点随影的候选边的相关信息
  40. {
  41. if(have_edge(g,v0,i))//若G中存在边(v0,i),设置顶点i到起点v0的候选信息,内容包括
  42. {
  43. MinEdges[i].vertex = g->vexs[v0];
  44. MinEdges[i].weight = g->edge[v0][i];//另一短点以及相应的权值
  45. }else MinEdges[i].weight = infinity;//否则,(v0,i)边不存在
  46. }
  47. return ;
  48. }
  49.  
  50. /*
  51. *判断顶点v是否被选择
  52. */
  53. bool judge(Vertextype v,Vertextype select[],int n)
  54. {
  55. int i;
  56. bool flags = true;
  57. for(i=;i<n;i++)
  58. {
  59. if(select[i]==v)
  60. {
  61. flags = false;
  62. break;
  63. }
  64. }
  65. return flags;
  66. }
  67.  
  68. /*
  69. *从候选边集中选出最短的顶点
  70. */
  71. int Get_MinEdge(graph *&g,MinEdgeArray &MinEdges,Vertextype select[],int n)
  72. {
  73. int MMin,i,k;
  74. MMin = infinity;
  75. for(i=;i<g->numVerTex;i++)
  76. {
  77. if((judge(g->vexs[i],select,n))&&(MinEdges[i].weight<=MMin))
  78. {
  79. k = i;
  80. MMin = MinEdges[i].weight;
  81. }
  82. }
  83. return k;
  84. }
  85.  
  86. /*
  87. *对新选出的候选顶点k调整当前候选边集
  88. */
  89. int change_MinEdge_with(graph *&g,MinEdgeArray &MinEdges,int k,Vertextype select[],int n)
  90. {
  91. int i;
  92. for(i=;i<g->numVerTex;i++)
  93. {
  94. if(judge(g->vexs[i],select,n))//i是未选定点
  95. {
  96. if(have_edge(g,k,i)&&(g->edge[k][i]<MinEdges[i].weight))//若i到k有更小的边
  97. {
  98. MinEdges[i].vertex = g->vexs[k];
  99. MinEdges[i].weight = g->edge[k][i];
  100. }
  101. }
  102. }
  103. return ;
  104. }
  105.  
  106. /*
  107. *prim
  108. */
  109. int prim(graph *&g,int v0)
  110. {
  111. int count = ;
  112. Vertextype select_vertex[maxvex];
  113. MinEdgeArray MinEdges;
  114. int i,j,k;
  115. select_vertex[count++] = g->vexs[v0];
  116. Init_MinEdges(g,MinEdges,v0);
  117. for(i=;i<g->numVerTex-;i++)
  118. {
  119. k = Get_MinEdge(g,MinEdges,select_vertex,count);
  120. select_vertex[count++] = g->vexs[k];
  121. change_MinEdge_with(g,MinEdges,k,select_vertex,count);
  122. }
  123. cout<<"Prim:";
  124. for(i=;i<count;i++){
  125. if(i!=count-)cout<<select_vertex[i]<<"->";
  126. else cout<<select_vertex[i]<<endl;
  127. }
  128. cout<<endl;
  129. return ;
  130. }
  131. int create(graph *&g)
  132. {
  133. int i,j,k,weight;
  134. cout<<"input numVerTex(顶点数):";
  135. cin>>g->numVerTex;
  136. cout<<"input numEdge(边数):";
  137. cin>>g->numEdge;
  138. cout<<"input(各顶点):"<<endl;
  139. for(i=;i<g->numVerTex;i++)
  140. {
  141. cin>>g->vexs[i];
  142. }
  143. for(i=;i<g->numVerTex;i++)
  144. {
  145. for(j=;j<g->numEdge;j++)
  146. {
  147. g->edge[i][j] = infinity;
  148. }
  149. }
  150. cout<<"input(各边两个顶点对应的下标和权值i,j,weight,edge[i][j]=weight):"<<endl;
  151. for(k=;k<g->numEdge;k++)
  152. {
  153. cout<<"i,j,weight:";
  154. cin>>i>>j>>weight;
  155. g->edge[i][j] = weight;
  156. g->edge[j][i] = weight;
  157.  
  158. }
  159. cout<<endl;
  160. return ;
  161. }
  162.  
  163. int main()
  164. {
  165. graph *g = new graph;
  166. create(g);
  167. Vertextype invertex;
  168. int start;
  169. cout<<"input start invertex:";
  170. cin>>invertex;
  171.  
  172. for(int i=;i<g->numVerTex;i++)
  173. {
  174. if(g->vexs[i]==invertex){
  175. start = i;
  176. }
  177. }
  178. prim(g,start);
  179. return ;
  180. }

6)图[2]Prim算法[最小生成树]的更多相关文章

  1. 数据结构与算法系列研究七——图、prim算法、dijkstra算法

    图.prim算法.dijkstra算法 1. 图的定义 图(Graph)可以简单表示为G=<V, E>,其中V称为顶点(vertex)集合,E称为边(edge)集合.图论中的图(graph ...

  2. 图——图的Prim法最小生成树实现

    1,运营商的挑战: 1,在下图标出的城市间架设一条通信线路: 2,要求: 1,任意两个城市间都能够通信: 2,将架设成本降至最低: 2,问题抽象: 1,如何在图中选择 n - 1 条边使得 n 个顶点 ...

  3. [讲解]prim算法<最小生成树>

    最小生成树的方法一般比较常用的就是kruskal和prim算法 一个是按边从小到大加,一个是按点从小到大加,两个方法都是比较常用的,都不是很难... kruskal算法在本文里我就不讲了,本文的重点是 ...

  4. Prim算法---最小生成树

    最小生成树的Prim算法也是贪心算法的一大经典应用.Prim算法的特点是时刻维护一棵树,算法不断加边,加的过程始终是一棵树. Prim算法过程: 一条边一条边地加, 维护一棵树. 初始 E = {}空 ...

  5. 图的最小生成树prim算法模板

    用prim算法构建最小生成树适合顶点数据较少而边较多的图(稠密图) prim算法生成连通图的最小生成树模板伪代码: G为图,一般为全局变量,数组d为顶点与集合s的最短距离 Prim(G, d[]){ ...

  6. 数据结构:最小生成树--Prim算法

    最小生成树:Prim算法 最小生成树 给定一无向带权图.顶点数是n,要使图连通仅仅需n-1条边.若这n-1条边的权值和最小,则称有这n个顶点和n-1条边构成了图的最小生成树(minimum-cost ...

  7. 最小生成树-普利姆(Prim)算法

    最小生成树-普利姆(Prim)算法 最小生成树 概念:将给出的所有点连接起来(即从一个点可到任意一个点),且连接路径之和最小的图叫最小生成树.最小生成树属于一种树形结构(树形结构是一种特殊的图),或者 ...

  8. 数据结构代码整理(线性表,栈,队列,串,二叉树,图的建立和遍历stl,最小生成树prim算法)。。持续更新中。。。

    //归并排序递归方法实现 #include <iostream> #include <cstdio> using namespace std; #define maxn 100 ...

  9. C++编程练习(10)----“图的最小生成树“(Prim算法、Kruskal算法)

    1.Prim 算法 以某顶点为起点,逐步找各顶点上最小权值的边来构建最小生成树. 2.Kruskal 算法 直接寻找最小权值的边来构建最小生成树. 比较: Kruskal 算法主要是针对边来展开,边数 ...

随机推荐

  1. Java面试题之Struts优缺点

    优点: 1. 实现MVC模式,结构清晰,使开发者只关注业务逻辑的实现. 2.有丰富的tag可以用 ,Struts的标记库(Taglib),如能灵活动用,则能大大提高开发效率 3. 页面导航 使系统的脉 ...

  2. 安装Eclipse Html Editor

    最近在eclipse中开发android项目,用到了jquery mobile框架,则会涉及到新建html文件,发现eclipse不自带新建html文件的插件,必须得新建一个其他形式的文件,譬如xml ...

  3. ScrollView属性fillViewport解决android布局不能撑满全屏的问题

    转:http://blog.sina.com.cn/s/blog_6cf2ea6a0102v61f.html 开发项目中遇到一个问题,布局高度在某些国产酷派小屏幕手机上高度不够全部显示,于是使用了Sc ...

  4. Javascript 匀速运动停止条件——逐行分析代码,让你轻松了解运动的原理

    我们先来看下之前的匀速运动的代码,修改了速度speed后会出现怎么样的一个bug.这里加了两个标杆用于测试 <style type="text/css"> #div1 ...

  5. 理解TCP为什么需要进行三次握手

        在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接. 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认: ...

  6. 让vs2010的html编辑器验证html5语法

    或者在Tools -> option -> Text Editor -> Html -> Validation

  7. ORACLE视图添加备注

    ORACLE视图添加备注 版权声明:本文为博主原创文章,未经博主允许不得转载. create or replace view oes_material_series_ref as select t.p ...

  8. ORACLE-Kill 杀死正在执行的Oracle存储过程和死锁语句

    ORACLE-Kill 杀死正在执行的Oracle存储过程和死锁语句 存储过程 1.找到正在执行的存储过程的 sid ,serial# select   b.sid,b.SERIAL#,a.OBJEC ...

  9. 一个不错的文章-【原创】2014年信息安全产品及厂家分类-SOC&SIEM安全厂家 | Srxh1314

    转载:http://www.srxh1314.com/2014-sec-company-soc-siem.html http://www.bugsec.org/1598.html http://www ...

  10. alois

    Background It's not simple to know what happens in a bigger network. There's a multitude of applicat ...