国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > C++ > 正文

最小生成樹(shù)算法之Prim算法

2020-05-23 14:17:28
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

這篇文章主要講解了普里姆算法(Prim算法),圖論中的一種算法,可在加權(quán)連通圖里搜索最小生成樹(shù),需要的朋友可以參考下

本文介紹了最小生成樹(shù)的定義,Prim算法的實(shí)現(xiàn)步驟,通過(guò)簡(jiǎn)單舉例實(shí)現(xiàn)了C語(yǔ)言編程。

1.什么是最小生成樹(shù)算法?

簡(jiǎn)言之,就是給定一個(gè)具有n個(gè)頂點(diǎn)的加權(quán)的無(wú)相連通圖,用n-1條邊連接這n個(gè)頂點(diǎn),并且使得連接之后的所有邊的權(quán)值之和最小。這就叫最小生成樹(shù)算法,最典型的兩種算法就是Kruskal算法和本文要講的Prim算法。

2.Prim算法的步驟是什么?

這就要涉及一些圖論的知識(shí)了。

a.假定圖的頂點(diǎn)集合為V,邊集合為E.

b.初始化點(diǎn)集合U={u}.//u為V中的任意選定的一點(diǎn)

c.從u的鄰接結(jié)點(diǎn)中選取一點(diǎn)v使這兩點(diǎn)之間的權(quán)重最小,然后將v加入集合U中.

d.從結(jié)點(diǎn)v出發(fā),重復(fù)c步驟,直到V={}.

3.舉個(gè)例子來(lái)說(shuō)明Prim算法的步驟:

一個(gè)簡(jiǎn)單的加權(quán)拓?fù)鋱D如下所示

最小生成樹(shù)算法之Prim算法

選取1為初始點(diǎn),則按照上面所示的步驟訪問(wèn)結(jié)點(diǎn)的順序依次次為:

最小生成樹(shù)算法之Prim算法

則最終訪問(wèn)結(jié)點(diǎn)的順序:1,3,4,2,5.

4.Prim算法的具體C語(yǔ)言編程實(shí)現(xiàn):

 

  1. #include <stdio.h> 
  2. #include <cstdlib> 
  3. #include<memory.h> 
  4. const int Max =0x7fffffff; 
  5. const int N=50; 
  6.  
  7. int n; 
  8. int g[N][N],dis[N],visited[N]; 
  9.  
  10. int prim() 
  11. int i,j; 
  12. int pos,min; 
  13. int ans=0; 
  14. memset(visited,0,sizeof(visited)); 
  15. visited[1]=1;pos=1; 
  16. //assign a value to the dis[N] first 
  17. for(i=2;i<=n;i++) 
  18. dis[i]=g[pos][i]; 
  19. for(i=1;i<n;i++) 
  20. min=Max;  
  21. for(j=1;j<=n;j++) 
  22. if(visited[j]==0&&min>dis[j]) 
  23. min=dis[j]; 
  24. pos=j;  
  25. printf("The node being traversed is :%d/n",pos); 
  26. ans+=min; 
  27. printf("The value of ans is %d/n",ans); 
  28. //mark the node 
  29. visited[pos]=1; 
  30. //update the weight 
  31. for(j=1;j<=n;j++) 
  32. if(visited[j]==0&&dis[j]>g[pos][j]) 
  33. dis[j]=g[pos][j]; 
  34. return ans; 
  35.  
  36. int main() 
  37. int i=1,j=1; 
  38. int ans=0; 
  39. int w; 
  40. printf("Please enter the number of the nodes:/n"); 
  41. scanf("%d",&n); 
  42. for(i=1;i<=n;i++) 
  43. for(j=1;j<=n;j++) 
  44. if(i==j) 
  45. g[i][j]=0; 
  46. else 
  47. g[i][j]=Max; 
  48. printf("Please enter the number of the edges:/n"); 
  49. int edgenum; 
  50. scanf("%d",&edgenum); 
  51. int v1,v2; 
  52. printf("Please enter the number and the corresponding weight:/n"); 
  53. for(i=1;i<=edgenum;i++) 
  54. scanf("%d%d%d",&v1,&v2,&w); 
  55. g[v1][v2]=g[v2][v1]=w; 
  56. ans=prim(); 
  57. printf("The sum of the weight of the edges is:%d/n",ans); 
  58. system("pause"); 
  59. return 0; 
  60.  

5.程序運(yùn)行后的結(jié)果截圖

最小生成樹(shù)算法之Prim算法

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 富川| 疏勒县| 基隆市| 湖口县| 独山县| 弥渡县| 平远县| 新建县| 色达县| 左权县| 龙井市| 搜索| 凤台县| 吉木萨尔县| 普安县| 大名县| 五华县| 临沭县| 济源市| 廉江市| 大兴区| 故城县| 墨玉县| 陆川县| 海盐县| 苏尼特右旗| 六安市| 阿拉善左旗| 宁远县| 博白县| 吉安市| 广德县| 黑水县| 罗田县| 榆林市| 镇宁| 温泉县| 罗定市| 巢湖市| 南木林县| 崇阳县|