c语言最小生成树,使用C语言实现最小生成树求解的简单方法
最小生成树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语言实现最小生成树求解的简单方法相关推荐
- python是不是最简单的语言_全世界都公认运行Python的最简单方法
Python是一种跨平台的编程语言,这意味着它可以在Windows,macOS,Linux等多种平台上运行,甚至可以移植到Java和.NET虚拟机.它是免费和开源的. 即使当今的大多数Linux和Ma ...
- r语言 断轴 画图_R语言基础画图/绘图/作图
R语言基础画图 R语言免费且开源,其强大和自由的画图功能,深受广大学生和可视化工作人员喜爱,这篇文章对如何使用R语言作基本的图形,如直方图,点图,饼状图以及箱线图进行简单介绍. 0 结构 每种图形构成 ...
- c语言 字母 八进制表示'/1011',C语言C语言第一课:C语言概述为什么学习C语言怎样学习C语言.DOC...
[摘要]C语言 第一课: C语言概述 为什么学习C语言 怎样学习C语言 参考资料 ----------------------------------------------------------- ...
- 学单片机需要多少C语言基础,C语言单片机编程教程
很多学员和朋友经常找我给他们推荐C语言的书,他们可能想和我当年一样,闷头大干一场,学个几个月的C语言,把C语言吃透,再开始单片机程序开发! 别!别!别! 大家千万别这么干,我当年自学了3个月的C语言, ...
- R语言使用car包的outlierTest函数通过假设检验的方法检测回归模型中的异常值(outlier)、输出异常值对应的统计量、p值以及Bonferonnii校正p值
R语言使用car包的outlierTest函数通过假设检验的方法检测回归模型中的异常值(outlier).输出异常值对应的统计量.p值以及Bonferonnii校正p值 目录
- R语言时间序列(time series)分析实战:简单指数平滑法预测
R语言时间序列(time series)分析实战:简单指数平滑法预测 目录
- 为什么可以说Java语言是准动态语言?
什么是动态语言? 动态语言,是指程序在运行时可以改变其结构:新的函数可以被引进,已有的函数可以被删除等在结构上的变化.比如JavaScript便是一个典型的动态语言. 除此之外如Ruby.Python ...
- “可扩展标记语言”(XML) 提供一种描述结构化数据的方法。
摘要: "可扩展标记语言"(XML) 提供一种描述结构化数据的方法.与主要用于控制数据的显示和外观的 HTML 标记不同,XML 标记用于定义数据本身的结构和数据类型. XML 使 ...
- c语言课件 文件,C语言课件--文件.ppt
C语言课件--文件 例12-5 /*将字符串"apple", "grape", "pear" 写入到磁盘文件f12-5.txt中,然后再从该 ...
最新文章
- 基于JWT(Json Web Token)的ASP.NET Web API授权方式
- Linux_LVMQuota
- 深入理解分布式技术 - 理论基石 CAP
- Spark _10_补充部分算子【三】
- 智伴机器人课文跟读哪里有_仁爱版英语九年级上册Unit4 Topic1单词课文朗读/翻译+知识汇总...
- 工作401-普通编译模式
- 上海建桥学院linux网络管理实验报告,上海建桥学院信息技术系《操作系统(Linux).PDF...
- 42 MM配置-采购-条件-定义工厂层的条件控制
- spark rdd读取文件
- iPhone越狱cydia源大全
- ASN.1入门(超详细)
- Python实现基于ClipCap的看图说话Image Caption模型
- 基于安卓系统(android)记事本APP管理系统设计与实现
- php 通过sendcloud发送邮件附件功能
- 高通耳机阻抗估算流程
- 同城小程序需要的服务器配置,微同城小程序-设置教程-一站云
- node用express写后端restful接口实战三:sequelize操作数据库:模型(Model)、迁移(Migration)与种子(Seeders)
- 域名解析的DNS缓存如何清理
- 单位可不可以起诉来解除劳动关系
- Windows配置网络
热门文章
- mysql 定时备份
- 【图像压缩】自回归模型 《Joint Autoregressive and Hierarchical Priors for Learned Image Compression》
- iOS 定位失败 非洲 经纬度为0,0
- inno setup 卸载注册表_inno setup 自定义生成的卸载程序
- 施努卡:CCD视觉检测 CCD视觉检测设备厂家
- 爬虫与反爬的常见套路
- navicat for mysql 8.0激活码
- OPENCV的下载和安装
- 学计算机常用到的英语,常用计算机英语词汇学习
- Hibernate 官网 config code