[算法]最小生成树-priml算法

[算法]最小生成树-priml算法

prim算法的思想比较简单,详细可以看看维基百科的prim算法介绍,这里就简单说说这个算法的核心

之前的最小生成树-kruskal算法是通过逐步条件边数来获得最小生成树

与kruskal算法一样,prim算也是一种贪心算法,S为已经选入生成树的点,Q是待选入生成树的点的候选集

1、初始化添加任意一点入S

2、在Q选一点与S最近的点i加入S,这里一个点i与S的距离如右定义:dist[S,i]=min{m[s][i]:s属于S},

3、更新Q中每一点与S的距离

4、如果所有点已经添加入S中,则已经生成了最小生成树,退出循环,否则转向2

 1 #include <iostream>

 2 using namespace std;

 3 const int infinite = 9999;

 4 const int maxSize = 5;

 5 int prim(int m[][maxSize], int n){

 6     bool selected[maxSize];

 7     int d[maxSize],p[maxSize];

 8     //d记录当前最小生成树的点集合S到候选点的距离 

 9     //p记录候选点到S的最短距离的前驱 

10     int i = 0;

11     selected[i] = true;

12     d[i] = 0;//初始化添加0结点入S中 

13     while(++i < n){

14         selected[i] = false;//标记其他还没进入S 

15         p[i] = 0;//初始化各点到S中的前驱均为0结点 

16         d[i] = m[0][i];//最短距离为邻接距离 

17     }

18     int count = 1;//记录S中的个数 

19     int min, candidate, sum = 0;//candidate记录候选集中距离S中近的点 

20     while(count < n){

21         min = infinite;

22         for(i = 1; i < n; ++i){//寻找候选集中距离S最近的点 

23             if(!selected[i] && d[i] < min){

24                 min = d[i];

25                 candidate = i;

26             }

27         }

28         ++count;

29         selected[candidate] = true;

30         sum += m[p[candidate]][candidate];

31         for(i = 1; i < n; ++i){//更新候选集中的点到S的最短距离以及前驱 

32             if(!selected[i] && m[candidate][i] < d[i]){

33                 d[i] = m[candidate][i];

34                 p[i] = candidate;

35             }

36         }

37         d[candidate] = 0;

38     }

39     return sum;

40 }

41 int main(int argc, char**){

42     int map[maxSize][maxSize]={{0,5,infinite,infinite,7},

43                                 {5,0,4,2,infinite},

44                                 {infinite,4,0,6,8},

45                                 {infinite,2,6,0,1},

46                                 {7,infinite,8,1,0}};

47 

48     int p[maxSize],d[maxSize];

49     cout<<prim(map,5);

50     return 0;

51 }

 


本文基于知识共享署名-非商业性使用 3.0 许可协议进行许可。欢迎转载、演绎,但是必须保留本文的署名林羽飞扬,若需咨询,请给我发信

你可能感兴趣的:(最小生成树)