最小生成树Prim算法朴素版有几点需要说明一下。

1、2个for循环都是从2开始的,因为一般我们默认开始就把第一个节点加入生成树,因此之后不需要再次寻找它。

2、lowcost[i]记录的是以节点i为终点的最小边权值。初始化时因为默认把第一个节点加入生成树,因此lowcost[i] = graph[1][i],即最小边权值就是各节点到1号节点的边权值。

3、mst[i]记录的是lowcost[i]对应的起点,这样有起点,有终点,即可唯一确定一条边了。初始化时mst[i] = 1,即每条边都是从1号节点出发。

编写程序:对于如下一个带权无向图,给出节点个数以及所有边权值,用Prim算法求最小生成树。

输入数据:

7 11

A B 7

A D 5

B C 8

B D 9

B E 7

C E 5

D E 15

D F 6

E F 8

E G 9

F G 11

A - D : 5

D - F : 6

A - B : 7

B - E : 7

E - C : 5

E - G : 9

Total:39

最小生成树Prim算法朴素版 C语言实现 代码如下

#include

#include

#define MAX 100

#define MAXCOST 0x7fffffff

int graph[MAX][MAX];

int Prim(int graph[][MAX],int n)

{

/* lowcost[i]记录以i为终点的边的最小权值,当lowcost[i]=0时表示终点i加入生成树 */

int lowcost[MAX];

/* mst[i]记录对应lowcost[i]的起点,当mst[i]=0时表示起点i加入生成树 */

int mst[MAX];

int i,j,min,minid,sum = 0;

/* 默认选择1号节点加入生成树,从2号节点开始初始化 */

for (i = 2; i <= n; i++)

{

/* 最短距离初始化为其他节点到1号节点的距离 */

lowcost[i] = graph[1][i];

/* 标记所有节点的起点皆为默认的1号节点 */

mst[i] = 1;

}

/* 标记1号节点加入生成树 */

mst[1] = 0;

/* n个节点至少需要n-1条边构成最小生成树 */

for (i = 2; i <= n; i++)

{

min = MAXCOST;

minid = 0;

/* 找满足条件的最小权值边的节点minid */

for (j = 2; j <= n; j++)

{

/* 边权值较小且不在生成树中 */

if (lowcost[j] < min && lowcost[j] != 0)

{

min = lowcost[j];

minid = j;

}

}

/* 输出生成树边的信息:起点,终点,权值 */

printf("%c - %c : %d\n",mst[minid] + 'A' - 1,minid + 'A' - 1,min);

/* 累加权值 */

sum += min;

/* 标记节点minid加入生成树 */

lowcost[minid] = 0;

/* 更新当前节点minid到其他节点的权值 */

for (j = 2; j <= n; j++)

{

/* 发现更小的权值 */

if (graph[minid][j] < lowcost[j])

{

/* 更新权值信息 */

lowcost[j] = graph[minid][j];

/* 更新最小权值边的起点 */

mst[j] = minid;

}

}

}

/* 返回最小权值和 */

return sum;

}

int main()

{

int i,k,m,n;

int x,y,cost;

char chx,chy;

/* 读取节点和边的数目 */

scanf("%d%d",&m,&n);

getchar();

/* 初始化图,所有节点间距离为无穷大 */

for (i = 1; i <= m; i++)

{

for (j = 1; j <= m; j++)

{

graph[i][j] = MAXCOST;

}

}

/* 读取边信息 */

for (k = 0; k < n; k++)

{

scanf("%c %c %d",&chx,&chy,&cost);

getchar();

i = chx - 'A' + 1;

j = chy - 'A' + 1;

graph[i][j] = cost;

graph[j][i] = cost;

}

/* 求解最小生成树 */

cost = Prim(graph,m);

/* 输出最小权值和 */

printf("Total:%d\n",cost);

//system("pause");

return 0;

}

Kruskal算法:

void Kruskal(Edge E[],int n,int e)

{

int i,m1,m2,sn1,sn2,k;

int vset[MAXE];

for (i=0;i

k=1; //k表示当前构造最小生成树的第几条边,初值为1

j=0; //E中边的下标,初值为0

while (k

{

m1=E[j].u;m2=E[j].v; //取一条边的头尾顶点

sn1=vset[m1];sn2=vset[m2]; //分别得到两个顶点所属的集合编号

if (sn1!=sn2) //两顶点属于不同的集合,该边是最小生成树的一条边

{

printf(" (%d,%d):%d/n",E[j].w);

k++; //生成边数增1

for (i=0;i

if (vset[i]==sn2) //集合编号为sn2的改为sn1

vset[i]=sn1;

}

j++; //扫描下一条边

}

}

总结

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

小编个人微信号 jb51ccc

喜欢与人分享编程技术与工作经验,欢迎加入编程之家官方交流群!

c语言最小生成树,使用C语言实现最小生成树求解的简单方法相关推荐

  1. python是不是最简单的语言_全世界都公认运行Python的最简单方法

    Python是一种跨平台的编程语言,这意味着它可以在Windows,macOS,Linux等多种平台上运行,甚至可以移植到Java和.NET虚拟机.它是免费和开源的. 即使当今的大多数Linux和Ma ...

  2. r语言 断轴 画图_R语言基础画图/绘图/作图

    R语言基础画图 R语言免费且开源,其强大和自由的画图功能,深受广大学生和可视化工作人员喜爱,这篇文章对如何使用R语言作基本的图形,如直方图,点图,饼状图以及箱线图进行简单介绍. 0 结构 每种图形构成 ...

  3. c语言 字母 八进制表示'/1011',C语言C语言第一课:C语言概述为什么学习C语言怎样学习C语言.DOC...

    [摘要]C语言 第一课: C语言概述 为什么学习C语言 怎样学习C语言 参考资料 ----------------------------------------------------------- ...

  4. 学单片机需要多少C语言基础,C语言单片机编程教程

    很多学员和朋友经常找我给他们推荐C语言的书,他们可能想和我当年一样,闷头大干一场,学个几个月的C语言,把C语言吃透,再开始单片机程序开发! 别!别!别! 大家千万别这么干,我当年自学了3个月的C语言, ...

  5. R语言使用car包的outlierTest函数通过假设检验的方法检测回归模型中的异常值(outlier)、输出异常值对应的统计量、p值以及Bonferonnii校正p值

    R语言使用car包的outlierTest函数通过假设检验的方法检测回归模型中的异常值(outlier).输出异常值对应的统计量.p值以及Bonferonnii校正p值 目录

  6. R语言时间序列(time series)分析实战:简单指数平滑法预测

    R语言时间序列(time series)分析实战:简单指数平滑法预测 目录

  7. 为什么可以说Java语言是准动态语言?

    什么是动态语言? 动态语言,是指程序在运行时可以改变其结构:新的函数可以被引进,已有的函数可以被删除等在结构上的变化.比如JavaScript便是一个典型的动态语言. 除此之外如Ruby.Python ...

  8. “可扩展标记语言”(XML) 提供一种描述结构化数据的方法。

    摘要: "可扩展标记语言"(XML) 提供一种描述结构化数据的方法.与主要用于控制数据的显示和外观的 HTML 标记不同,XML 标记用于定义数据本身的结构和数据类型. XML 使 ...

  9. c语言课件 文件,C语言课件--文件.ppt

    C语言课件--文件 例12-5 /*将字符串"apple", "grape", "pear" 写入到磁盘文件f12-5.txt中,然后再从该 ...

最新文章

  1. 基于JWT(Json Web Token)的ASP.NET Web API授权方式
  2. Linux_LVMQuota
  3. 深入理解分布式技术 - 理论基石 CAP
  4. Spark _10_补充部分算子【三】
  5. 智伴机器人课文跟读哪里有_仁爱版英语九年级上册Unit4 Topic1单词课文朗读/翻译+知识汇总...
  6. 工作401-普通编译模式
  7. 上海建桥学院linux网络管理实验报告,上海建桥学院信息技术系《操作系统(Linux).PDF...
  8. 42 MM配置-采购-条件-定义工厂层的条件控制
  9. spark rdd读取文件
  10. iPhone越狱cydia源大全
  11. ASN.1入门(超详细)
  12. Python实现基于ClipCap的看图说话Image Caption模型
  13. 基于安卓系统(android)记事本APP管理系统设计与实现
  14. php 通过sendcloud发送邮件附件功能
  15. 高通耳机阻抗估算流程
  16. 同城小程序需要的服务器配置,微同城小程序-设置教程-一站云
  17. node用express写后端restful接口实战三:sequelize操作数据库:模型(Model)、迁移(Migration)与种子(Seeders)
  18. 域名解析的DNS缓存如何清理
  19. 单位可不可以起诉来解除劳动关系
  20. Windows配置网络

热门文章

  1. mysql 定时备份
  2. 【图像压缩】自回归模型 《Joint Autoregressive and Hierarchical Priors for Learned Image Compression》
  3. iOS 定位失败 非洲 经纬度为0,0
  4. inno setup 卸载注册表_inno setup 自定义生成的卸载程序
  5. 施努卡:CCD视觉检测 CCD视觉检测设备厂家
  6. 爬虫与反爬的常见套路
  7. navicat for mysql 8.0激活码
  8. OPENCV的下载和安装
  9. 学计算机常用到的英语,常用计算机英语词汇学习
  10. Hibernate 官网 config code