Prim算法
时间:2022-04-22
本文章向大家介绍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("nn");
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 }
运行结果
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 一个ABAP和JavaScript这两种编程语言的横向比较
- WebRTC & Android 开发学习环境搭建~
- word模板和XML数据源是如何合并生成最后的word文档的详细过程
- Angular路由跳转时,如何传递信息
- Angular里的购物车页面实现
- CentOS7部署WeADMIN监控主机交换机和URL(无坑版)
- JsonPath实践(一)
- 开源测试服务
- Charles报错Failed to install helper解决方案
- [890]scrapy之pipeline的使用
- Redis的slot迁移工具
- 一文搞懂Flink rocksdb中的数据恢复
- Linux expect用法介绍
- GitHub通过access token来clone代码
- 在.NET Core中使用MongoDB明细教程(1):驱动基础及文档插入