Prim算法

简介:

普利姆算法,是一种常用的求最小生成树的算法。

最小生成树,使得一个连通图内拥有最小的和。对现实生活中有极大的作用。

主要思路

1 选定一个顶点(与结果无关)

2 寻找与这个顶点相连的最小权值的邻居

复制代码
while(j<MAXSIZE){  //寻找生成树相连的最小权值的顶点
            if(lowcost[j]!=0  && lowcost[j] < min){
                min = lowcost[j];
                k = j;
            }

            j++;
        }
复制代码

3 把这个邻居,加入到最小生成树集合中。

4 在此新加入的顶点基础上,寻找与该集合相连的最小权值的邻居。重复2。

复制代码
for(j=1;j<MAXSIZE;j++){
            if(lowcost[j]!=0 && g->arc[k][j] < lowcost[j]){
                lowcost[j] = g->arc[k][j];
                ver[j] = k;
            }

        }
复制代码

5 直到所有顶点都存在于该集合中

算法代码

复制代码
 1 void Prim(Graph *g){
 2     int min,i,j,k;
 3     int ver[MAXSIZE];
 4     int lowcost[MAXSIZE];
 5     lowcost[0] = 0;
 6     ver[0] = 0;
 7     for(i=1;i<MAXSIZE;i++){
 8         lowcost[i] = g->arc[0][i];
 9         ver[i] = 0;
10     }
11     for(i=1;i<MAXSIZE;i++){
12         min = INF;
13 
14         j=1;
15         k=0;
16 
17         while(j<MAXSIZE){  //寻找生成树相连的最小权值的顶点
18             if(lowcost[j]!=0  && lowcost[j] < min){
19                 min = lowcost[j];
20                 k = j;
21             }
22 
23             j++;
24         }
25 
26         printf("(%d , %d)\n",ver[k],k);
27 
28         lowcost[k] = 0;
29 
30         for(j=1;j<MAXSIZE;j++){
31             if(lowcost[j]!=0 && g->arc[k][j] < lowcost[j]){
32                 lowcost[j] = g->arc[k][j];
33                 ver[j] = k;
34             }
35 
36         }
37     }
38 }
复制代码

示例代码

复制代码
 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #define MAXSIZE 9
 4 #define INF 65535
 5 typedef struct Graph{
 6     int arc[MAXSIZE][MAXSIZE];
 7 }Graph;
 8 
 9 void initGraph(Graph *g);
10 void showGraph(Graph *g);
11 void Prim(Graph *g);
12 
13 int num[MAXSIZE][MAXSIZE]={ 0,  10, INF,INF,INF,11, INF,INF,INF,
14                 10, 0,  18, INF,INF,INF,16, INF,12,
15                 INF,INF,0,  22, INF,INF,INF,INF,8,
16                 INF,INF,22, 0,  20, INF,INF,16, 21,
17                 INF,INF,INF,20, 0,  26, INF,7,  INF,
18                 11, INF,INF,INF,26, 0,  17, INF,INF,
19                 INF,16, INF,INF,INF,17, 0,  19, INF,
20                 INF,INF,INF,16, 7,  INF,19, 0,  INF,
21                 INF,12, 8,  21, INF,INF,INF,INF,0};
22 int main()
23 {
24     Graph *g = (Graph *)malloc(sizeof(Graph));
25     initGraph(g);
26     showGraph(g);
27     printf("\n\n");
28     Prim(g);
29 
30     return 0;
31 }
32 
33 void initGraph(Graph *g){
34    int i,j;
35    for(i=0;i<9;i++){
36         for(j=0;j<9;j++){
37             g->arc[i][j]=num[i][j];
38         }
39     }
40 }
41 void showGraph(Graph *g){
42     int i,j;
43     for(i=0;i<9;i++){
44         for(j=0;j<9;j++){
45             printf("%d ",g->arc[i][j]);
46         }
47         printf("\n");
48     }
49 }
50 
51 void Prim(Graph *g){
52     int min,i,j,k;
53     int ver[MAXSIZE];
54     int lowcost[MAXSIZE];
55     lowcost[0] = 0;
56     ver[0] = 0;
57     for(i=1;i<MAXSIZE;i++){
58         lowcost[i] = g->arc[0][i];
59         ver[i] = 0;
60     }
61     for(i=1;i<MAXSIZE;i++){
62         min = INF;
63 
64         j=1;
65         k=0;
66 
67         while(j<MAXSIZE){  //寻找生成树相连的最小权值的顶点
68             if(lowcost[j]!=0  && lowcost[j] < min){
69                 min = lowcost[j];
70                 k = j;
71             }
72 
73             j++;
74         }
75 
76         printf("(%d , %d)\n",ver[k],k);
77 
78         lowcost[k] = 0;
79 
80         for(j=1;j<MAXSIZE;j++){
81             if(lowcost[j]!=0 && g->arc[k][j] < lowcost[j]){
82                 lowcost[j] = g->arc[k][j];
83                 ver[j] = k;
84             }
85 
86         }
87     }
88 }
复制代码

运行结果

本文转自博客园xingoo的博客,原文链接:Prim算法,如需转载请自行联系原博主。
相关文章
|
算法
最小生成树算法:Prim算法
在图论中,最小生成树(Minimum Spanning Tree,简称MST)是一种常用的算法问题。最小生成树是指在一个加权连通图中选取边的子集,使得所有顶点都被覆盖,并且边的总权值最小。
224 0
|
2月前
|
机器学习/深度学习 算法 Java
算法设计(动态规划应用实验报告)实现基于贪婪技术思想的Prim算法、Dijkstra算法
这篇文章介绍了基于贪婪技术思想的Prim算法和Dijkstra算法,包括它们的伪代码描述、Java源代码实现、时间效率分析,并展示了算法的测试用例结果,使读者对贪婪技术及其应用有了更深入的理解。
算法设计(动态规划应用实验报告)实现基于贪婪技术思想的Prim算法、Dijkstra算法
|
3月前
|
机器学习/深度学习 人工智能 算法
|
4月前
|
算法 C语言
数据结构与算法——最小生成树问题(什么是最小生成树、Prim算法、Kruskal算法)
数据结构与算法——最小生成树问题(什么是最小生成树、Prim算法、Kruskal算法)
28 0
|
11月前
|
算法 C++
用prim和kruskal算法求最小生成树问题
用prim和kruskal算法求最小生成树问题
75 0
|
供应链 算法 Java
java数据结构最经济的地下通道建设方案prim算法
MX是世界上第一大传媒娱乐企业,该公司数十年的经营历史中创作了很多经典影片,此外还经营着很多的规模十分宏大世界级的主题娱乐公园。最近MX公司刚和C国X城市达成协定,共同投资建设C国国内唯一一家主题娱乐公园。
58 0
|
算法 Java
数据结构(13)最小生成树JAVA版:prim算法、kruskal算法
13.1.概述 最小生成树,包含图的所有顶点的一棵树,树的边采用包含在图中的原有边中权重和最小的边。翻译成人话就是遍历一遍全图所有顶点的最短路径,这条路径就叫最小生成树。 最小生成树存在和图是连通图互为充要条件,顶点都不连通,肯定不可能有路能遍历一遍全图。 求解最小生成树有两种常用算法:
160 0
|
算法
Prim算法和Kruskal算法到底哪个好?
Prim算法和Kruskal算法到底哪个好?
185 0
|
算法
大话数据结构--Prim算法
大话数据结构--Prim算法
104 0
|
算法 内存技术
搜索与图论-最小生成树(Prim 算法和 Kruskal 算法)
搜索与图论-最小生成树(Prim 算法和 Kruskal 算法)
下一篇
无影云桌面