数据结构-Prim算法构造无向图的最小生成树

news2024/11/23 11:55:19

引子:

无向图如果是一个网,那么它的所有的生成树中必有一颗生成树的边的权值之和是最小的,我们称

这颗权值和最小的树为:“最小生成树”(MST)。

其中,一棵树的代价就是树中所有权值之和。

而在现实中,最小生成树的概念可以用来解决很多实际问题,例如,在n个城市之间建立交通网,

那么哪一条路径是最短的呢?就可以用最小生成树来解决。

算法思想:

设G = (V,E)为以连通网,其中V为顶点集合,E为带权边集合。

设置两个新集合U和T:

U用于存放最小生成树的顶点,T用于存放最小生成树的边。

令集合的初值为:{u0}(假设构造最小生成树时,从顶点u0出发。)

集合T的初值为{}。

从所有u∈U,v∈V-U的边(u,v)中,选取最小权值的边(u0,v0),将顶点v0加入集合U中,将边

(u0,v0)加入集合T中。

如此不断重复,知道U = V,最小生成树构造完成,集合T中包含了最小生成树中的所有边。

分析算法可知:

为了实现Prim算法,需要一个辅助数组closedge以记录从U到V-U具有最小代价的边。

对于closedge数组需要包含两个域:

adjvex和lowcost,其中lowcost = 0表示若顶点v不在生成树上,用closedge.lowcost存放v与生成树

上的另一个顶点的序号所构成边的权值。

adjvex存放与该边相关联的生成树上的另一顶点的序号。

算法生成图

对于下面这个无向图例子来说:

算法的执行过程如下:

代码部分:

#include<stdio.h>
#define MAX 100
typedef struct Mgraph{
	char vertex[MAX];
	int arcs[MAX][MAX];
	int vexnum,arcnum;
}Mgraph;

typedef struct Closedge{
	char adjvex[MAX];
	int lowcost[MAX];
}Closedge;

int LocateVerTex(Mgraph *G,char v)
{
	int k;
	for(k=0;k<G->vexnum;k++)
		if(G->vertex[k] == v)
			return k;
	return -1;
}

void CreateMgraph(Mgraph *G)
{
	int i,j,weight,adj1,adj2;
	char v1,v2;
	printf("请输入顶点数和边数:\n");
	scanf("%d %d",&G->vexnum,&G->arcnum);
	getchar();
	printf("请输入:{%d}个顶点:\n",G->vexnum);
	for(i=0;i<G->vexnum;i++)
		scanf("%c",&G->vertex[i]);
	getchar();
	printf("请输入:{%d}条边:(格式如下:v1 v2 权值).\n",G->arcnum);
	for(i=0;i<G->vexnum;i++){
		for(j=0;j<G->vexnum;j++){
			G->arcs[i][j] = 0;
		}
	}
	for(i=0;i<G->arcnum;i++){
		scanf("%c %c %d",&v1,&v2,&weight);
		getchar();
		adj1 = LocateVerTex(G,v1);
		adj2 = LocateVerTex(G,v2);
		if(adj1 == -1 || adj2 == -1){
			printf("失败.\n");
			i = i - 1;
			continue;
		}
		else{
			G->arcs[adj1][adj2] = weight;
			G->arcs[adj2][adj1] = weight;
			printf("成功.\n");
		}
	}
}

int MiniNum(Closedge *closedge,Mgraph *G)
{
	int j,p = 1,min = 999;
	for(j=0;j<G->vexnum;j++){
		if(closedge->lowcost[j] != 0 && closedge->lowcost[j] < min){
			min = closedge->lowcost[j];
			p = j;
		}
	}
	return p;
}

void MiniTree_Prim(Mgraph *G,char u)
{
	int i,j,k,num;
	k = LocateVerTex(G,u);
	Closedge closedge;
	for(i=0;i<G->vexnum;i++){
		if(i!=k){
			closedge.adjvex[i] = u;
			closedge.lowcost[i] = G->arcs[k][i];
		}
	}
	closedge.lowcost[k] = 0;
	printf("最小生成树的各条边为:\n");
	for(i=1;i<G->vexnum;i++){
		k = MiniNum(&closedge,G);
		printf("边:<%c,%c>,权值为{%d}:\n",closedge.adjvex[k],G->vertex[k],closedge.lowcost[k]);
		closedge.lowcost[k] = 0;
		for(j=0;j<G->vexnum;j++){
			if(G->arcs[k][j] < closedge.lowcost[j]){
				closedge.adjvex[j] = G->vertex[k];
				closedge.lowcost[j] = G->arcs[k][j];
			}
		}
	}
}

int main()
{
	Mgraph G;
	CreateMgraph(&G);
	MiniTree_Prim(&G,'A');
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1181768.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

幂等最佳实践

1、什么是幂等&#xff1f; 根据百度百科解释&#xff1a; “幂等&#xff08;idempotent、idempotence&#xff09;是一个数学与计算机学概念&#xff0c;常见于抽象代数中。 在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数&…

删除word最后一页之后的空白页

最近编辑word比较多&#xff0c;有时最后一页&#xff08;最后一页内容还有可能是表格&#xff09;之后&#xff0c;还有一页空白页&#xff0c;单独按下backspace、del都删不掉&#xff0c;很让人着急。 经过查询有几种方法&#xff1a; &#xff08;1&#xff09;点击选中空…

kubernetes(5) 续4

目录 volumes emptyDir卷 hostpath卷 nfs卷 持久卷 storageclass statefulset控制器 mysql主从部署 volumes emptyDir卷 [rootk8s2 volumes]# vim emptydir.yaml apiVersion: v1 kind: Pod metadata:name: vol1 spec:containers:- image: busyboxplusname: vm1command: ["…

pyqt5的组合式部件制作(一)

以多选一的选择器为例&#xff0c;来实践一下工程实用级别的组合式部件设计。自己之前做的自定义的组合式部件&#xff0c;结构不够简单优化&#xff0c;在实际的工程里面&#xff0c;使用部件的过程比较繁琐。所以&#xff0c;这里来做一个优化的实验。 之所以做这个组合部件&…

DevChat:开源AI编程助手的全面解析

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

【场景方案】前端如何结合GPT提升我们的开发效率,个人经验总结,不定期更新~

文章目录 AI模型的选择提问的方式很重要心里建设提问方法论设立角色从总体到局部步骤拆分&#xff0c;循序渐进举例子说明主动让他联系上文不要太纠结提问的方式 网址推荐尾巴 不说废话&#xff0c;没有铺垫&#xff0c;直接开始讲重点 AI模型的选择 首先咱们要选择一个适合的…

3-知识补充-HTTP协议

3-知识补充-HTTP协议 文章目录 3-知识补充-HTTP协议HTTP协议基础什么是HTTP&#xff1f;HTTP协议的会话方式HTTP1.0和HTTP1.1的区别 请求和响应报文报文的格式报文解析实例-请求百度官网请求报文-GET请求请求报文-POST请求-学习用-非请求百度官网响应报文 响应状态码有代表性的…

第八章认识Express框架

目录 Express模块化路由 基本概述 基本使用 基本构建 案例项目 Express接收请求参数 基本概述 基本类别 Express接收GET请求参数 Express接收POST请求参数 Express接收路由参数 Express模块化路由 基本概述 在Express中&#xff0c;路由是指确定应用程序如何响应对…

功率放大器的工作原理及选购技巧

功率放大器是电子设备中非常重要的组成部分之一&#xff0c;它的主要功能是将输入信号的功率进行放大&#xff0c;以驱动高功率负载。在各种应用领域中&#xff0c;如音频放大器、无线电频率放大器、射频功率放大器等&#xff0c;功率放大器都发挥着非常重要的作用。下面将介绍…

Kubernetes二进制搭建

目录 一、K8S的架构 二、K8S创建Pod资源的工作流程 三、K8S资源对象和资源配置信息 K8S资源对象 K8S资源配置信息 四、K8S的的三种网络和三种接口 三种网络&#xff1a; 三种节点&#xff1a; 五、etcd 集群 etcd 的特点&#xff1a; 六、flannel flannel方案 K8S …

指令手册术语缩写

指令手册术语缩写 1 指令汇总表中的操作码列(不带VEX前缀的指令)2 指令汇总表中的操作码列(带有VEX前缀的指令)3 操作码汇总表中的指令列 本文属于《 X86指令基础系列教程》之一&#xff0c;欢迎查看其它文章。 1 指令汇总表中的操作码列(不带VEX前缀的指令) 2 指令汇总表中的…

阿里云安全恶意程序检测(速通三)

阿里云安全恶意程序检测 特征工程进阶与方案优化pivot特征构建pivot特征pivot特征构建时间pivot特征构建细节特点 业务理解和结果分析结合模型理解业务多分类问题预测结果分析 特征工程进阶基于LightGBM模型验证模型结果分析模型测试 优化技巧与解决方案升级内存管理控制加速数…

【配置】如何在打包Spring Boot项目时按需使用日常、测试、预发、正式环境的配置文件

文章目录 前言1. 创建5个配置文件2. 在pom.xml文件中如下配置3. 在application.properties中加入环境变量 前言 在我们开发项目的时候&#xff0c;一般有四套环境&#xff1a;日常、测试、预发、正式。日常环境作为我们开发环境&#xff1b;测试环境给测试同学测试功能&#x…

基于厨师算法的无人机航迹规划-附代码

基于厨师算法的无人机航迹规划 文章目录 基于厨师算法的无人机航迹规划1.厨师搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用厨师算法来优化无人机航迹规划。 1.厨师搜索算法 …

Canal同步Mysql数据到ES以及Springboot项目查询ES数据

1、环境准备 服务器&#xff1a;Centos7 Jdk版本&#xff1a;1.8 Mysql版本&#xff1a;5.7.44 Canal版本&#xff1a;1.17 Es版本&#xff1a;7.12.1 kibana版本&#xff1a;7.12.1 软件包下载地址&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1jRpCJP0-hr9aI…

C++进阶篇4---番外-AVL树

一、AVL树的概念 二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索树将退化为单支树&#xff0c;查 找元素相当于在顺序表中搜索元素&#xff0c;效率低下。因此&#xff0c;两位俄罗斯的数学家G.M.Adelson-Velskii 和E.M.Landis在1962年发明了一…

Microsoft Dynamics 365 CE 扩展定制 - 8. DevOps

在本章中,我们将介绍以下内容: 使用PowerShell导出Dynamics 365解决方案使用PowerShell部署解决方案构建解决方案层次结构修补解决方案暂存解决方案使用SolutionPackager在源代码管理中保存解决方案使用PackageDeployer将您的解决方案与配置数据打包基于解决方案版本增量触发…

缓存-基础理论和Guava Cache介绍

缓存-基础理论和Guava Cache介绍 缓存基础理论 缓存的容量和扩容 缓存初始容量、最大容量&#xff0c;扩容阈值以及相应的扩容实现。 缓存分类 本地缓存&#xff1a;运行于本进程中的缓存&#xff0c; 如Java的 concurrentHashMap, Ehcache&#xff0c;Guava Cache。 分布式缓…

3.Netty中Channel通道概述

Selector 模型 Java NIO 是基于 Selector 模型来实现非阻塞的 I/O。Netty 底层是基于 Java NIO 实现的&#xff0c;因此也使用了 Selector 模型。 Selector 模型解决了传统的阻塞 I/O 编程一个客户端一个线程的问题。Selector 提供了一种机制&#xff0c;用于监视一个或多个 …

如何成为C++大神?五个技巧助你提升编程水平

一名优秀的C程序员是如何炼成的&#xff1f;这个问题一直困扰着许多人&#xff0c;尤其是那些刚刚踏入编程的世界的新手。C作为一门强大而复杂的编程语言&#xff0c;的确需要一些特殊的技巧和策略才能掌握。但幸运的是&#xff0c;成为一名出色的C程序员并不是不可能的任务。在…