最小生成树算法之Prim算法

2020-01-06 13:26:24刘景俊

这篇文章主要讲解了普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树,需要的朋友可以参考下

本文介绍了最小生成树的定义,Prim算法的实现步骤,通过简单举例实现了C语言编程。

1.什么是最小生成树算法?

简言之,就是给定一个具有n个顶点的加权的无相连通图,用n-1条边连接这n个顶点,并且使得连接之后的所有边的权值之和最小。这就叫最小生成树算法,最典型的两种算法就是Kruskal算法和本文要讲的Prim算法。

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

这就要涉及一些图论的知识了。

a.假定图的顶点集合为V,边集合为E.

b.初始化点集合U={u}.//u为V中的任意选定的一点

c.从u的邻接结点中选取一点v使这两点之间的权重最小,然后将v加入集合U中.

d.从结点v出发,重复c步骤,直到V={}.

3.举个例子来说明Prim算法的步骤:

一个简单的加权拓扑图如下所示

最小生成树算法之Prim算法

选取1为初始点,则按照上面所示的步骤访问结点的顺序依次次为:

最小生成树算法之Prim算法

则最终访问结点的顺序:1,3,4,2,5.

4.Prim算法的具体C语言编程实现:

 

  1. #include <stdio.h>  #include <cstdlib> 
  2. #include<memory.h>  const int Max =0x7fffffff; 
  3. const int N=50;   
  4. int n;  int g[N][N],dis[N],visited[N]; 
  5.   int prim() 
  6. {  int i,j; 
  7. int pos,min;  int ans=0; 
  8. memset(visited,0,sizeof(visited));  visited[1]=1;pos=1; 
  9. //assign a value to the dis[N] first  for(i=2;i<=n;i++) 
  10. dis[i]=g[pos][i];  for(i=1;i<n;i++) 
  11. {  min=Max;  
  12. for(j=1;j<=n;j++)  { 
  13. if(visited[j]==0&&min>dis[j])  { 
  14. min=dis[j];  pos=j;  
  15. }  } 
  16. printf("The node being traversed is :%dn",pos);  ans+=min; 
  17. printf("The value of ans is %dn",ans);  //mark the node