数据结构与算法-生成树与最小生成树

news2024/11/15 10:19:52

生成树与最小生成树

  • 🎈1.生成树与最小生成树
    • 🔭1.1生成树与最小生成树的概念
    • 🔭1.2最小生成树的生成准则
    • 🔭1.3两种最小生成树算法
      • 🏆1.3.1Kruskal算法
      • 🏆1.3.2Prim算法
  • 🎈2.有向无环图及其应用
    • 🔭2.1AOV网与拓扑排序
      • 🏆2.1.1拓扑排序方法
      • 🏆2.1.2拓扑排序的算法流程
    • 🔭2.2AOV网与关键路径
      • 🏆2.2.1事件的最早发生时间(ve)
      • 🏆2.2.2事件的最迟发生时间(vl)
      • 🏆2.2.3例题

🎈1.生成树与最小生成树

🔭1.1生成树与最小生成树的概念

G=(V,E)是一个连通图,G的一个生成子图若本身是一棵树,称它为G的一棵生成树。任何连通图都有生成树。
在这里插入图片描述
不难看出,有n个顶点的连通图的生成树必定有n-1条边,生成树是连通图的极小子图,在生成树中任意增加一条边,必定产生回路。
✅设G=(V,E)是一个带权连通图,其生成树上任一条边e的权值称为该边的代价W(e),G的一棵生成树T的代价W(T)就是生成树中各边的代价之和。在G的所有生成树中,代价最小的生成树称为最小代价生成树,简称最小生成树。

🔭1.2最小生成树的生成准则

✅最小生成树的生成准则

  • 只能选用该图中的边来构造最小生成树。
  • 必须使用且仅能使用n-1条边来连接连通图中的n个顶点。
  • 选用的n-1条边不能产生回路。
  • 尽量选取权值小的边。

🔭1.3两种最小生成树算法

  • Kruskal算法:通常适用于稀疏图
  • Prim算法:通常适用于稠密图

🏆1.3.1Kruskal算法

Kruskal算法是一种按照权值的递增次序选择合适的边来构造最小生成树的方法。

🔎设G=(V,E)是一个具有n个顶点的带权连通无向图,T=(V,TE)G的最小生成树,则构造最小生成树的步骤如下:

  1. 构造一个由n个顶点组成,不含任何边的图T=(V,∅),即TE为空集(其中每个顶点构成一个连通分量)。
  2. 不断从E中取出代价最小的一条边,若该边未使T形成回路(即该边的两个顶点来自T中不同的连通分量),则将此边加入到TE中,否则舍去此边选择下一条代价最小的边。以此类推,知道TE中包含n-1条边。

🎠Kruskal算法示例:
在这里插入图片描述

🏆1.3.2Prim算法

🔎设G=(V,E)是一个具有n个顶点的带权连通无向图,T=(V,TE)G的最小生成树,则构成最小生成树的步骤如下:

  1. 设置一个集合U,在图G上任选一个点u0加入U,算法从U={u0},TE=∅开始,重复执行下列操作。
  2. 在所有u属于U,v属于V-U的边(u,v)中找一条代价最小的边(u0,v0)并入集合TE,同时v0并入U,直至U=V为止。此时TE中必有n-1条边,T=(V,TE)G的最小生成树。
    🎠Prim算法示例:
    在这里插入图片描述

🎈2.有向无环图及其应用

有向无环图是一个无环的有向图,简称DAG图。AOV网和AOE网是DAG图的两个典型应用。

🔭2.1AOV网与拓扑排序

在现代管理系统中,人们常用有向图来描述和分析一项工程的计划和实施过程,一个工程常被分为多个子工程,这些子工程被称为活动。在有向图中若以顶点表示活动,有向边表示活动之间的优先关系的图称为AOV网

(Vi,Vj)是图中的有向边,则ViVj的直接前驱;VjVi的直接后继。若存在一条从ViVj的路径,则称ViVj的前驱,VjVi的后继。AOV网中不允许有回路,若存在回路,则意味着某项活动以自己为先决条件。

AOV网络中各顶点 按照它们互相之间的优先关系排列成的一个线性序列称为一个拓扑有序序列。若ViVj的前驱,则Vi一定排在Vj之前,对于没有优先关系的点,顺序任意。
AOV网中构造一个拓扑有序序列的过程称为拓扑排序。

🏆2.1.1拓扑排序方法

🔎拓扑排序的方法:

  1. 从有向图中选一个没有前驱的顶点并输出之。
  2. 从图中删除该顶点和所有以它为尾的弧。
  3. 重复上述两个步骤,直至全部顶点均已输出;或者当图中不存在无前驱的顶点为止(此时说明图中有环)。
    在这里插入图片描述
    📝对于上图,拓扑排序的序列为:V1 V5 V4 V3 V2 V6
    注:拓扑排序的结果不一定唯一!

🏆2.1.2拓扑排序的算法流程

✅拓扑排序算法流程如下:
(1).把邻接表中入度为0的顶点依次进栈。
(2).若栈不空,则栈顶元素Vj退栈并输出,在邻接表中查找Vj的直接后继Vk,把Vk的入度减1;若Vk的入度为0,则进栈,继续该过程。
(3).若顶点个数不为nn为有向图的顶点数),则有向图有环;否则,拓扑排序完毕。

int ALGraph::TopSort()
{
	LinkStack s;
	int i, j, k;
	ArcNode* p;
	int indegree[MaxVex];
	findindegree(indegree);
	for (i = 0; i < ag, vexnum; i++)
	{
		if (indegree[i] == 0)
		{
			s.Push(i);
		}
	}
	int count = 0;
	while (!s.EmptyStack())
	{
		s.Pop(j);
		cout << ag.vertices[j].data;
		count++;
		for (p = ag.vertices[j].firstarc; p != NULL; p = p->nextarc)
		{
			k = p->adjvex;
			indegree[k]--;
			if (indegree[k] == 0)
				s.Push(k);
		}
	}
	if (count < ag.vexnum)
	{
		cout << "图中存在回路,不存在拓扑排序" << endl;
		return 0;
	}
	else
	{
		cout << "是一个拓扑排序" << endl;
		return 1;
	}
}

🔭2.2AOV网与关键路径

带权的有向无环图,称为AOE网,其中顶点表示事件,弧(有向边)表示活动,权表示活动持续时间。在工程上常用工程进度计划。通常每个工程只有一个开始事件和一个结束事件,在表示工程的AOE网中,表示整个工程的开始点(入度为0的顶点)称为源点。表示整个工程的结束点(出度为0的顶点)称为汇点。在AOE网上,从源点到汇点的路径长度最长的一条路径,或者全部由关键活动(即不按期完成就会影响整个工程完成的活动)构成的路径称为关键路径

🏆2.2.1事件的最早发生时间(ve)

AOE网有n个顶点,用1表示源点,n表示汇点,j表示AOE网中的第j个顶点。事件j的最早发生时间ve(j),从源点1j结点的最长的路径,意味着事件j最早能够发生的时间,这个时间决定了所有以j为头的弧所表示的活动的最早开始时间。源点的最早发生时间为0,即ve(1)=0,从ve(1)=0开始向汇点递推,设事件j是事件i的直接后继,则ve(j)=max{ve(i)+dut(i,j)|(i,j)属于T,2<=j<=n},其中T是所有以i顶点为尾,j顶点为头的弧的集合。
在这里插入图片描述
若顶点旁边的值代表顶点的最早发生时间,则ve(j)=16.

🏆2.2.2事件的最迟发生时间(vl)

事件j的最迟发生时间vl(j):不影响工程的如期完成,事件j必须发生的时间。汇点的最迟发生时间vl(n)=ve(n),即汇点的最早发生时间等于最迟发生时间,从vl(n)开始向源点递推。设事件j是事件i的直接前驱,则vl(j)=min{vl(i)-dut(j,i)|(j,i)属于S,1<=j<=n-1}其中,S是所有以i为顶点,j顶点为尾的弧的集合。
在这里插入图片描述
图中若顶点旁边的值代表该顶点的最迟发生时间,则vl(j)=7.
在这里插入图片描述

🏆2.2.3例题

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

unity 打包exe设置分辨率

unity在2019以上版本不支持在打开的时候弹出分辨率设置的窗口&#xff0c;但是因为有些需求需要可以设置分辨率进行操作&#xff0c;我在查了好多办法后找到了解决方案&#xff0c;废话不多说开始干货。 1.先去百度云上下载这个文件 链接&#xff1a;https://pan.baidu.com/s/1…

MATLAB常用绘图函数的使用

文章目录 绘制一图一线绘制一图多线用法一&#xff1a;plot用法二&#xff1a;hold on 绘制一图多图其他形式的坐标图分段函数绘制方法一&#xff1a;分段写函数的定义域值域方法二&#xff1a;判断定义域方法三&#xff1a;if else 判断 横纵坐标范围设置标题、轴标签、图例、…

如何去云服务器申请环境跑深度学习模型

我的研究方向是显著性目标检测&#xff0c;虽然对比目标检测来说&#xff0c;数据集和模型的尺寸已经降低很多了&#xff0c;然后我们实验室也有一台公用服务器&#xff0c;但是那台服务器好多人使用&#xff0c;每个人能分配到的容量就很小&#xff0c;而且有时候会宕机&#…

测试和验证有什么区别,怎么划分测试集和验证集

测试集和验证集是在机器学习中用于评估模型性能的两个不同的数据集。它们有不同的目的和使用方式。 验证集&#xff08;Validation Set&#xff09;&#xff1a; 目的&#xff1a; 用于调整模型的超参数&#xff08;例如&#xff0c;学习率、正则化参数等&#xff09;和进行模型…

软件工程第十一周

面向对象 面向对象编程&#xff08;Object-Oriented Programming, OOP&#xff09;不仅仅是一种程序设计方法&#xff0c;它更是一种深刻的软件工程开发思想。这种思想的核心在于通过抽象和封装来模拟现实世界中的对象和概念&#xff0c;以便更好地管理和解决复杂的软件工程问…

005 OpenCV直方图

目录 一、环境 二、直方图原理概述 三、代码 一、环境 本文使用环境为&#xff1a; Windows10Python 3.9.17opencv-python 4.8.0.74 二、直方图原理概述 OpenCV是一个广泛使用的开源计算机视觉库&#xff0c;它提供了许多用于图像处理和分析的函数和算法。其中&#xff…

设置 wsl 桥接模式

一、环境要求 Win10/Win11 专业版&#xff0c;并已安装 Hyper-V 二、具体步骤 打开 Hyper-V 管理器 创建虚拟交换机 WSL Bridge 修改wsl配置文件 .wslconfig .wslconfig 文件所在路径如下&#xff1a; C:\Users\<UserName>\.wslconfig若 .wslconfig 文件不存在&am…

Sam Altman 或回归 OpenAI;格力 1.3 万研发人员没有海归派 外国人丨 RTE 开发者日报 Vol.86

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE &#xff08;Real Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

《Python数据科学项目实战》:开启数据科学之旅的实战指南!

《Python数据科学项目实战》是一本内容丰富且组织结构严谨的书籍&#xff0c;它旨在帮助读者通过实际案例研究掌握使用Python进行数据科学工作的必要知识。本书的案例研究涵盖了在线广告分析、使用新闻数据跟踪疾病暴发等多个现实世界的场景&#xff0c;使读者能够将所学知识应…

NOSQL----redis的安装和基础命令

redis是什么 1.redis-------非关系型数据库 redis是非关系数据库的一种&#xff0c;也称为缓存型数据库。 非关系型数据库和关系型数据库 1.关系型数据库 关系型数据库是一个结构化的数据库&#xff0c;记录方式是行和列&#xff08;列&#xff1a;声明对象&#xff0c;行&am…

【unity实战】unity3D中的PRG库存系统和换装系统(附项目源码)

文章目录 先来看看最终效果前言素材简单绘制库存UI前往mixamo获取人物模型动画获取一些自己喜欢的装备物品模型库存系统换装系统装备偏移问题添加消耗品最终效果源码完结 先来看看最终效果 前言 之前2d的换装和库存系统我们都做过不少了&#xff0c;这次就来学习一个3d版本的&…

有哪些相见恨晚的stm32学习的方法?

有哪些相见恨晚的stm32学习的方法&#xff1f; 单片机用处这么广&#xff0c;尤其是STM32生态这么火&#xff01;如何快速上手学习呢&#xff1f; 你要考虑的是&#xff0c;要用STM32实现什么&#xff1f;为什么使用STM32而不是用8051&#xff1f;是因为51的频率太低&#xff…

五分钟搭建开源ERP:Odoo,并实现公网远程访问

文章目录 前言1. 下载安装Odoo&#xff1a;2. 实现公网访问Odoo本地系统&#xff1a;3. 固定域名访问Odoo本地系统 前言 Odoo是全球流行的开源企业管理套件&#xff0c;是一个一站式全功能ERP及电商平台。 开源性质&#xff1a;Odoo是一个开源的ERP软件&#xff0c;这意味着企…

建筑可视化中的 3D 纹理

在线工具推荐&#xff1a; 三维数字孪生场景工具 - GLTF/GLB在线编辑器 - Three.js AI自动纹理化开发 - YOLO 虚幻合成数据生成器 - 3D模型在线转换 - 3D模型预览图生成服务 1、什么是 3D 纹理&#xff1f; 纹理是将二维图像添加到三维模型的技术艺术。虽然对物体进行纹…

Python懒羊羊

目录 系列文章 写在前面 绘图基础 懒羊羊 写在后面 系列文章 序号文章目录直达链接表白系列1浪漫520表白代码https://want595.blog.csdn.net/article/details/1306668812满屏表白代码https://want595.blog.csdn.net/article/details/1297945183跳动的爱心https://want595…

2023年A特种设备相关管理(锅炉压力容器压力管道)证模拟考试题库及A特种设备相关管理(锅炉压力容器压力管道)理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年A特种设备相关管理&#xff08;锅炉压力容器压力管道&#xff09;证模拟考试题库及A特种设备相关管理&#xff08;锅炉压力容器压力管道&#xff09;理论考试试题是由安全生产模拟考试一点通提供&#xff0c;A特…

【带头学C++】----- 七、链表 ---- 7.5 学生管理系统(链表--下)

目录 1.补充上节插入节点的第三种方法&#xff08;按序插入&#xff09; 图示说明需求原理&#xff1a; 代码实现&#xff1a; 实际效果&#xff1a; 2.查询链表节点 1.方法调用 2.搜索函数实现 3.搜索功能结果展示测试 3.删除链表 1.图示删除链表的原理 ​编辑 2…

Thinkphp6实现定时任务功能

本文主要介绍命令启动定时任务的功能&#xff0c;按照CRMEB标准版的程序为大家详细的进行实现过程的介绍 首先创建安装Worker&#xff0c;执行composer require topthink/think-worker 安装在config/console.php中定义指令 timer > \crmeb\command\Timer::class 3. 对应图1…

vue3-组合式API

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;Vue篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来vue篇专栏内容:vue3-组合式API 目录 组合式API 1.1 什么是组合式API 1.2 为什么使用它 1.2.1 更好的逻辑复用#…

AutoSAR CANIF层配置代码分析

CAN物理控制单元 配置&#xff1a; 生成的代码&#xff1a; CanIf_CtrlStates 解析 类型&#xff1a; typedef union CanIf_CtrlStatesUTag {CanIf_CtrlStatesType raw[3];CanIf_CtrlStatesStructSType str; }CanIf_CtrlStatesUType;typedef struct sCanIf_CtrlStatesType {C…