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

生成树与最小生成树

  • 🎈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.mzph.cn/news/150852.shtml

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

相关文章

virtuoso 后仿 ADE L error

ADE后仿时出现error ERROR (SFE-23): "input.scs" 299: The instance _57_D32_noxref is referencing an undefined model or subcircuit, parasitic_nwd. Either include the file containing the definition of parasitic_nwd, or define parasitic_nwd before run…

iTerm2+oh-my-zsh搭个Mac电脑上好用好看终端

根据苹果网站上介绍&#xff0c;bash是 macOS Mojave 及更早版本中的默认Shell&#xff0c;从 macOS Catalina 开始&#xff0c;zsh(Z shell) 是所有新建用户帐户的默认Shell。 1. 安装Oh my zsh sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzs…

选择java商城开发商需要注意哪些方面?

Java商城开发是一项庞大而复杂的任务&#xff0c;选择一家合适的开发商至关重要。那么&#xff0c;我们在选择Java商城开发商时&#xff0c;需要注意哪些方面呢&#xff1f; 1、专业经验 选择具有丰富经验的开发商是至关重要的。开发商应该拥有多年的Java开发经验&#xff0c;…

【MATLAB源码-第82期】基于matlab的OFDM系统载波频移偏差(CFO)估计,对比三种不同的方法。

操作环境&#xff1a; MATLAB 2013b 1、算法描述 正交频分复用&#xff08;OFDM&#xff09;系统中的载波频率偏移&#xff08;CFO&#xff09;估计是一项关键技术&#xff0c;用于确保数据传输的准确性和效率。CFO通常由于振荡器频率不匹配和多普勒频移引起。不同的CFO估计…

DP1332E/DP1363F国产多协议NFC读写器芯片支持ISO15693/ISO18092

目录 ISO/IEC 15693与ISO/IEC 18092协议标准差异DP1363F与DP1332E对比共同点主要差异点 ISO/IEC 15693与ISO/IEC 18092协议标准差异 ISO/IEC 15693是用于近距离无线通信中的射频识别&#xff08;RFID&#xff09;技术的标准协议&#xff0c;它定义了与读写器之间的通信协议。这…

LeetCode热题100——图论

图论 1. 岛屿的数量2. 腐烂的橘子 1. 岛屿的数量 给你一个由 ‘1’&#xff08;陆地&#xff09;和 ‘0’&#xff08;水&#xff09;组成的的二维网格&#xff0c;请你计算网格中岛屿的数量。岛屿总是被水包围&#xff0c;并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆…

微信、支付宝、携程等多款app任意文件读取漏洞

声明 本文仅用于技术交流&#xff0c;请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任。 一、漏洞描述 微信、支付宝、小米浏览器、携程应用等国内主流软件均存…

C编译环境和预处理(非常详细,建议收藏)

C编译环境和预处理&#xff08;非常详细&#xff0c;建议收藏&#xff09; 一、程序的翻译环境和执行环境二、 详解编译链接2.1 翻译环境2.2 编译本身的几个阶段符号汇总、符号表、合并段表、符号表的合并和重定位分别是什么&#xff1f; 2.2 运行环境 三、预处理详解3.1 预定义…

斐波那契数列,剑指offer,力扣

目录 题目地址&#xff1a; 我们直接看题解吧&#xff1a; 解题方法&#xff1a; 难度分析&#xff1a; 审题目事例提示&#xff1a; 解题思路&#xff08;动态规划&#xff09;&#xff1a; 代码实现&#xff1a; 补充说明&#xff1a; 代码&#xff08;优化&#xff09;&…

栈和队列

目录 1.栈 1.1栈的概念及结构 1.2栈的实现 2.队列 2.1队列的概念及结构 2.2队列的实现 1.栈 1.1栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈…

概念解析 | 网络安全数字孪生(Digital Twin of Cyber Security, DTCS)技术

注1:本文系“概念解析”系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:网络安全数字孪生。 概念解析 | 网络安全的“数字镜像” —— 网络安全数字孪生 1. 背景介绍 随着数字化转型进程的深入推进,网络空间安全问题日益凸显。当前的网络安全防护面…

使用Dockerfile构建hexo博客镜像,并部署

基于centos7.9父镜像构建hexo:1.0镜像&#xff1a; cat << eof > Dockerfile # 根镜像 FROM centos:7.9.2009 MAINTAINER qv123<qv1095322098163.com> # 设置工作目录 WORKDIR /usr/src/app # 暴露端口号 EXPOSE 4000 # 作者注释 MAINTAINER qv123<qv1095322…

关于响应式编程ReactiveX,RxGo

ReactiveX&#xff0c;简称为 Rx&#xff0c;是一个异步编程的 API。与 callback&#xff08;回调&#xff09;、promise&#xff08;JS 提供这种方式&#xff09;和 deferred&#xff08;Python 的 twisted 网络编程库就是使用这种方式&#xff09;这些异步编程方式有所不同&a…

C语言实现冒泡排序(超详细)

排序算法 - 冒泡排序 什么是冒泡排序&#xff1f;冒泡排序有啥用呢&#xff1f;冒泡排序的实现代码讲解冒泡排序的总结 什么是冒泡排序&#xff1f; 冒泡排序是一种简单的排序算法&#xff0c;它重复地遍历要排序的列表&#xff0c;一次比较两个元素&#xff0c;如果它们的顺序…

Springboot框架中使用 Redis + Lua 脚本进行限流功能

Springboot框架中使用 Redis Lua 脚本进行限流功能 限流是一种用于控制系统资源利用率或确保服务质量的策略。在Web应用中&#xff0c;限流通常用于控制接口请求的频率&#xff0c;防止过多的请求导致系统负载过大或者防止恶意攻击。 什么是限流&#xff1f; 限流是一种通过…

MySql操作

Mysql数据库项目学习笔记 1.条件查询后排序 (SELECT counter : 0) temp设定临时变量ORDER BY id ASC用于将id以升序形式进行排列 SELECTcounter : counter 1 AS ROW,username,type,content FROMtest_info,( SELECTcounter : 0 ) temp WHEREusername 2 AND type 3 ORDER BYi…

项目交互-选择器交互

选择器交互 <div><el-select v-model"valueOne" placeholder"年级"><el-option v-for"item in optionsOne" :key"item.gradeId" :label"item.gradeName" :value"item.gradeId"></el-option&…

UnitTest + Selenium 完成在线加法器自动化测试

1. 任务概述 利用 UnitTest 与 Selenium 编写自动化用例&#xff0c;测试在线加法器中的整数单次加法功能【如123 】 人工操作流程&#xff08;测试 12 是否等于 3&#xff09;&#xff1a; 打开在线加法器点击按钮1&#xff0c;再点击按钮&#xff0c;再点击按钮2&#xff0c…

接口测试 —— 接口测试的意义

1、接口测试的意义&#xff08;优势&#xff09; &#xff08;1&#xff09;更早的发现问题&#xff1a; 不少的测试资料中强调&#xff0c;测试应该更早的介入到项目开发中&#xff0c;因为越早的发现bug&#xff0c;修复的成本越低。 然而功能测试必须要等到系统提供可测试…

scss的高级用法——循环

周末愉快呀&#xff01;一起来学一点简单但非常有用的css小知识。 最近在一个项目中看到以下css class写法&#xff1a; 了解过tailwind css或者unocss的都知道&#xff0c;从命名就可以看出有以下样式&#xff1a; font-size: 30pxmargin-left: 5px;margin-top: 10px; 于是…