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

引子:

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

这颗权值和最小的树为:“最小生成树”(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] = 9999;
		}
	}
	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;
}

验证部分:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STM32 TIM定时器,配置,详解(1)

计数器寄存器(TIMx_CNT)、预分频器寄存器(TIMx_PSC)、自动重载寄存器(TIMx_ARR)。 PSC预分频器&#xff0c;顾名思义&#xff0c;先预备一下分频&#xff0c;有时候频率过高&#xff0c;后面的定时器承受不住&#xff0c;就先用PSC先分频一下。如何分频的&#xff1f;将每接受到…

地铁机电设备健康管理现状及改善方法

轨道交通和我们的生活息息相关&#xff0c;从火车到地铁再到轻轨&#xff0c;给人们的出行带来了很大的便利。因此&#xff0c;保障轨道交通的的正常运行和安全至关重要&#xff0c;需要运维人员及时排查设备的问题&#xff0c;解决故障&#xff0c;保证轨道交通的安全运行。本…

干洗店洗鞋店管理系统app小程序;

干洗店洗鞋店管理系统是一款专业的洗衣店管理软件&#xff0c;集成了前台收费收银系统、会员卡管理系统和财务报表系统等强大功能。界面简洁优美&#xff0c;操作直观简单。这款系统为干洗店和洗衣店提供了成本分析、利润分析、洗衣流程管理等诸多实用功能&#xff0c;用全新的…

线程基础概念

目录 背景知识 堆空间的划分 缺页中断 虚拟地址到物理地址的映射 线程是什么 线程是什么 理解线程 创建线程 再次理解线程 重新理解进程 背景知识 下面的三个问题实际是堆虚拟地址空间的再一次理解&#xff01; 堆空间的划分 再虚拟地址空间的那一块&#xff0c;我…

【MySQL事务篇】多版本并发控制(MVCC)

多版本并发控制(MVCC) 文章目录 多版本并发控制(MVCC)1. 概述2. 快照读与当前读2.1 快照读2.2 当前读 3. MVCC实现原理之ReadView3.1 ReadView概述3.2 设计思路3.3 ReadView的规则3.4 MVCC整体操作流程 4. 举例说明4.1 READ COMMITTED隔离级别下4.2 REPEATABLE READ隔离级别下 …

软件测试|selenium执行js脚本

JavaScript是运行在客户端&#xff08;浏览器&#xff09;和服务器端的脚本语言&#xff0c;允许将静态网页转换为交互式网页。可以通过 Python Selenium WebDriver 执行 JavaScript 语句&#xff0c;在Web页面中进行js交互。那么js能做的事&#xff0c;Selenium应该大部分也能…

Spring的注入

目录 一、Spring的概念 二、各种数据类型的注入 &#xff08;1&#xff09;studentService &#xff08;2&#xff09;applicationContext.xml&#xff08;Sring核心配置文件&#xff09; &#xff08;3&#xff09;测试 三、注入null或者empty类型的数据 &#xff08;1…

ESP-IDF-V5.1.1使用websocket

IDF Component Registry (espressif.com) 在windows系统中&#xff0c;在项目目录下使用命令 idf.py add-dependency "espressif/esp_websocket_client^1.1.0"

【小黑送书—第四期】>>用“价值”的视角来看安全:《构建新型网络形态下的网络空间安全体系》

经过30多年的发展&#xff0c;安全已经深入到信息化的方方面面&#xff0c;形成了一个庞大的产业和复杂的理论、技术和产品体系。 因此&#xff0c;需要站在网络空间的高度看待安全与网络的关系&#xff0c;站在安全产业的高度看待安全厂商与客户的关系&#xff0c;站在企业的高…

软件测试|测试方法论—边界值

边界值分析法是一种很实用的黑盒测试用例方法&#xff0c;它具有很强的发现故障的能力。边界值分析法也是作为对等价类划分法的补充&#xff0c;测试用例来自等价类的边界。 这个方法其实是在测试实践当中发现&#xff0c;Bug 往往出现在定义域或值域的边界上&#xff0c;而不…

目标跟踪(DeepSORT)

本文首先将介绍在目标跟踪任务中常用的匈牙利算法&#xff08;Hungarian Algorithm&#xff09;和卡尔曼滤波&#xff08;Kalman Filter&#xff09;&#xff0c;然后介绍经典算法DeepSORT的工作流程以及对相关源码进行解析。 目前主流的目标跟踪算法都是基于Tracking-by-Detec…

【离散数学】图论

图 无向图 <V,E>有序二元组&#xff0c;代表一个无向图G V是顶点的集合&#xff0c;元素为顶点&#xff1b;称为顶点集 E是边的集合&#xff0c;元素为无向边&#xff1b;称为边集合 有向图 <V,E>有序二元组&#xff0c;代表一个有向图G V是顶点的集合&#x…

07-MySQL-进阶-锁InnoDB引擎MySQL管理

涉及资料 链接&#xff1a;https://pan.baidu.com/s/1M1oXN_pH3RGADx90ZFbfLQ?pwdCoke 提取码&#xff1a;Coke 一、锁 ①&#xff1a;概述 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中&#xff0c;除传统的计算资源&#xff08;CPU、RAM、I/O&#xf…

Git的安装以及它的介绍

目录 一. Git简介 分布式特点 优缺点 Git 与 SVN 区别 二. Git安装 三. Git常用命令 四. Git的文件状态 1.文件状态 2.工作区域 一. Git简介 Git 是一个开源的分布式版本控制系统&#xff0c;可以有效、高速地处理从很小到非常大的项目版本管理。 也是Linus Torvalds…

ChatGPT 的 Text Completion

该章节我们来学习一下 “Text Completion” &#xff0c;也就是 “文本完成” 。“Text Completion” 并不是一种模型&#xff0c;而是指模型能够根据上下文自动完成缺失的文本部分&#xff0c;生成完整的文本。 ⭐ Text Completion 的介绍 Text Completion 也称为文本自动补全…

Kafka入门

kafka无疑是当今互联网公司使用最广泛的分布式实时消息流系统&#xff0c;它的高吞吐量&#xff0c;高可靠等特点为并发下的大批量实时请求处理提供了可靠保障。很多同学在项目中都用到过kafka&#xff0c;但是对kafka的设计原理以及处理机制并不是十分清楚。为了知其然知其所以…

2023年眼镜行业分析(京东眼镜销量数据分析):市场规模同比增长26%,消费需求持续释放

随着我国经济的不断发展&#xff0c;电子产品不断普及&#xff0c;低龄及老龄人口的用眼场景不断增多&#xff0c;不同年龄阶段的人群有不同的视力问题&#xff0c;因此&#xff0c;视力问题人口基数也随之不断加大&#xff0c;由此佩戴眼镜的人群也不断增多。 同时&#xff0c…

2023 全栈工程师 Node.Js 服务器端 web 框架 Express.js 详细教程(更新中)

Express 框架概述 Express 是一个基于 Node.js 平台的快速、开放、极简的Web开发框架。它本身仅仅提供了 web 开发的基础功能&#xff0c;但是通过中间件的方式集成了外部插件来处理HTTP请求&#xff0c;例如 body-parser 用于解析 HTTP 请求体&#xff0c;compression 用于压…

微前端qiankun嵌入vue项目后iconfont显示方块

个人项目地址&#xff1a; SubTopH前端开发个人站 &#xff08;自己开发的前端功能和UI组件&#xff0c;一些有趣的小功能&#xff0c;感兴趣的伙伴可以访问&#xff0c;欢迎提出更好的想法&#xff0c;私信沟通&#xff0c;网站属于静态页面&#xff09; SubTopH前端开发个人…

【Linux】第十四站:进程优先级

文章目录 一、Linux内核怎么设计各种结构二、进程优先级1.基本概念2.是什么3.为什么要有优先级4.批量化注释操作5.查看优先级6.PRI and NI 三、位图与优先级 一、Linux内核怎么设计各种结构 我们前面所写的数据结构都是比较单纯的。 而linux中就比较复杂了&#xff0c;同一个…