数据结构——图的应用

2023-09-15 16:15:14


前言

  1. 图的应用
    1.1 最小生成树
    1.2 最短路径
    1.3 拓扑结构
    1.4 关键路径

一、图的应用

1. 最小生成树

  1. 定义:从图中选取若干条边,将所有顶点连接起来,并且所选取的这些边的权值之和最小
    1).最小生成树的算法
    a. 普里姆算法
    b. 克鲁斯卡尔算法
  2. 最小生成树性质
    (1)最小生成树树形不唯一;图中各权值互不相等时,G的最小生成树唯一;若无向图连通图边比顶点少1,即G本身就是一棵树,G的最小生成树就是本身
    (2)虽然最小生成树不唯一,但最小生成树边的权值之和唯一且最小
    (3)最小生成树边数为顶点数减1

普里姆(Prim)算法

  1. 概念:算法从一个顶点开始,在此顶点对应的结点中寻找最小权值的结点连接,如此往复,直至满了为止,此时树必有n-1条边
    在这里插入图片描述

在这里插入图片描述

  1. 时间复杂度:O(|V|²),不依赖于|E|,适用于求解稠密图的最小生成树

克鲁斯卡尔(Kruskal)算法

  1. 按权值递增序列选择合适的边来构造最小生成树,开始时,每个顶点构成一棵独立的树,T此时为仅含V各结点的森林,按G的边的权值递增顺序选择一条边,若这条边加入不构成回路,则将其加入,否则舍弃,直到含有n-1条边;构造时按网中权值由小到大的顺序,不断选取当前未被选取的边集中权值最小的边,选取n-1条边
    在这里插入图片描述
    在这里插入图片描述
  2. 时间复杂度:采用堆存放边的集合,O(|E|log|E|),适用于边稀疏而顶点较多的图
    在这里插入图片描述

2. 最短路径

概念:对于带权图,路径上权值之和最小的叫最短路径

Dijkstra算法求单源最短路径

  1. 概念:从某一顶点出发,求到另一顶点的最小路径(带权值),可以从一顶点出发挨个搜寻,每一趟都需要得到最短的路径,求的是一顶点到所有其他顶点的路径

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

  1. 时间复杂度:邻接矩阵为O(|V|²),邻接表为O(|V|²),若要找出所有结点之间最短距离,则时间复杂度为O(|V|³)
  2. 注意:若有负权值,此算法不适用
  3. Floyd算法求各顶点间最短路经过
    产生一个n阶方阵 (k从-1开始到n-1)表示从顶点vi到vj路径长度,k表示绕行第k个顶点运算步骤;初始时,vi和vj之间存在边,则以此边权值作为最短路径,若不存在边则以无穷作为权值;以后逐步加入顶点k作为中间顶点,若增加中间结点得到的路径比原路径减少了,则以此新路径代替原来路径

在这里插入图片描述

  1. 时间复杂度:O(|V|³)
  2. 注意:允许带负权值的边,但不允许包含带负权值的边组成的回路,也适用于带权无向图

3. 拓扑结构

  1. 有向无环图:有向图中不存在环,称为DAG图
  2. 拓扑排序
    (1)一个有向无环图顶点组成的序列满足下列条件
    ①每个顶点出现仅出现一次
    ②若顶点A排在B前面,则不存在从B到A的路径
    (2)对一个DAG图进行拓扑排序
    ①从DAG中选择一个没有前驱的顶点并输出
    ②从图中删除该顶点和所有以它为起点的有向边
    ③重复(1)(2)直到DAG图为空或者图中不存在无前驱顶点为止,而后一种情况说明有向图必存在环
    在这里插入图片描述
    (3)时间复杂度:O(|V|+|E|)
    (4)用拓扑排序算法处理DAG图时,注意:
    ①一个顶点有多个直接后继,拓扑排序不唯一;但若各个顶点已经排在一个线性有序序列中,每个顶点有唯一前驱后继关系,则结果唯一
    ②对于一般的图,若它的邻接矩阵是三角矩阵,则存在拓扑序列
    如果进行到某一步,无法找到无前趋的顶点,则说明此AOV网络中存在有向环路,遇到这种情况,拓扑排序就无法进行了。
    在算法中需要用定量的描述替代定性的概念
    没有前驱的顶点=入度为零的顶点
    删除顶点及以它为尾的弧=弧头顶点的入度减1

4. 关键路径

  1. 相关概念
    源点:存在唯一的入度为0的顶点,叫源点
    汇点:存在唯一的,出度为0的顶点叫汇点
    关键路径:从源点到汇点的最长路径的长度,即为完成整个工程任务所需的时间,该路径称为关键路径。
    关键活动:关键路径上的活动叫做关键活动
  2. AOE网
    (1)概念:在有向图中,用顶点表示事件,用弧表示活动,弧的权值表示活动所需的时间,这种有向无环图叫做边表示活动的网,简称AOE-网
    (2)AOE网性质:(1)只有某顶点表示的事件发生后,从该顶点出发的有向边所表示的活动才能开始(2)只有在进入某一顶点各有向边所代表的活动都已经结束时,该顶点所代表的事件才能发生
    (3)AOE网中只有一个源点(入度为0)表示工程开始,也只有一个汇点(出度为0)表示工程结束
    (4)只有路径上所有活动都完成了,整个工程才结束,从源点到汇点的最大路径长度的路径称为关键路径,关键路径上的活动叫关键活动(e(i)=l(i))
    (5)最短时间就是关键路径长度,也就是关键路径上各活动花费开销之和
  3. 求关键路径步骤
    (1)求AOE网中所有事件最早发生时间ve()
    (2)求AOE网中所有事件最迟发生时间vl()
    (3)求AOE网中所有活动最早开始时间e()
    (4)求AOE网中所有活动最迟开始时间l()
    (5)求AOE网中所有活动的差额d(),找出所有d()=0的活动构成关键路径

在这里插入图片描述

注:
(1)可以判断有向图是否有环:深度优先遍历、拓扑排序、关键路径
(2)不存在拓扑排序的有向图,必存在回路
(3)只有关键路径上所有活动时间同时减少,才能缩短工期

总结

  1. 图的应用
    1.1 最小生成树
    1.2 最短路径
    1.3 拓扑结构
    1.4 关键路径
更多推荐

使用Selenium和Python自动预订车票

在本文中,我们将探讨如何使用Selenium和Python自动预订车票。我们将以12306.cn网站为例,演示自动化预订车票的过程。通过阅读本文,您将更好地了解如何使用Selenium与网页进行交互。准备工作首先,我们需要安装Selenium库。您可以使用以下命令在您的Python环境中安装Selenium:shell

基于LUT查找表方法的图像gamma校正算法FPGA实现,包括tb测试文件和MATLAB辅助验证

目录1.算法运行效果图预览2.算法运行软件版本3.部分核心程序4.算法理论概述5.算法完整程序工程1.算法运行效果图预览将gamma=2.2和gamma=1/2.2的数据分别导入到matlab进行对比:2.算法运行软件版本matlab2022a3.部分核心程序`timescale1ns/1ps////Company:/

公共4G广播音柱有哪些用处

公共广播音柱有哪些用处公共广播音柱是一种用于广播音频信号的设备,一般安装在公共场所或街道上。它具有以下几个主要用处:1.喊话广播:公共广播音柱可以用于喊话广播,用来传达重要信息、紧急通知、警报等,如公共安全提示、灾害警报、紧急疏散指示等。2.音乐播放:公共广播音柱可以通过播放音乐来为公共场所创造愉悦的氛围,如在公园、广

【STM32】使用RTE ,从 0 开始创建一个 (keil) ARM MDK工程(纯keil,标准库,以STM32F103C8T6为例)

学习相关的基础知识请阅读本专栏其他文章,一定有你想要的。https://blog.csdn.net/weixin_43764974/category_11021363.html本文软硬件:STM32F103C8T6ARMMDK5.38ARMcomplier6ST-Linkv2StdPeriphDrivers(标准库)一

Java基础(二十四):MySQL

文章目录一、数据库(创建、显示、删除、备份、恢复)二、MySQL常用数据类型2.1数值型(整数)2.2数值型(二进制bit)2.3数值型(小数)2.4字符型2.5日期类型三、表结构的操作四、表的增删改查4.1插入INSERT4.2修改UPDATE4.3删除DELETE4.4(单表)查询SELETE五、函数5.1排序、统

详细介绍oracle分区的使用:如何创建修改删除分区、插入数据提示分区已满或者分区不存在如何操作、近期数据使用分区历史数据不分区如何操作

一、前言什么是表分区:Oracle的分区是一种将表或索引数据分割为更小、更易管理的部分的技术。它可以提高查询性能、简化维护操作,并提供更好的数据组织和管理。表分区和表空间的区别和联系:在Oracle数据库中,表空间(Tablespace)是用于存储表、索引和其他数据库对象的逻辑存储单元。而分区(Partition)是表

blog--2建站

建站1loginorsigningithub2在github账户中创建一个项目名为你的Github用户名.github.io这是存放生成出来的网站文件的地方3在本地环境编写网站(原因开头:每次更新发布都需要修改整个网站延迟2min左右)选择hugo主题模板网站的地方https://themes.gohugo.io/打开

微服务生态系统:使用Spring Cloud构建分布式系统

文章目录什么是微服务?为什么选择SpringCloud?SpringCloud的关键组件示例:构建一个简单的微服务步骤1:创建SpringBoot项目步骤2:配置Eureka服务发现步骤3:创建REST控制器步骤4:运行项目步骤5:使用Feign进行服务间通信构建更大规模的微服务生态系统1.安全性2.监控和追踪3.熔断

企业怎么优化固定资产管理

在优化固定资产管理的过程中,不仅要关注硬件设备和设施的维护,还要重视软件系统和数据管理。一些可能的方法:需要建立一套完整的资产管理系统。这个系统应该包括资产的采购、登记、使用、维修、报废等各个环节的管理流程。通过这个系统,可以实时了解每个资产的状态,及时发现并解决潜在的问题。应该对固定资产进行定期的盘点和维护。这不仅可

PostgreSQL 排查慢 SQL

文章目录前言1.日志参数设置2.pg_stat_statements插件2.1确认是否安装插件2.2编译插件2.3载入插件2.4插件使用3.慢SQL排查手段3.1查询当前会话3.2查看TOPSQL前言所谓慢SQL是指在数据库中执行时间超过指定阈值的语句。慢查询太多,对于业务而言,是有很大风险的,可能随时都会因为某种原因

使用Git把项目上传到Gitee的详细步骤

1.到Git官网下载并安装2.到Gitee官网进行注册,然后在Gitee中新建一个远程仓库3.设置远程仓库的参数4.返回Gitee查看仓库是否生成成功5.新建一个文件夹作为你的本地仓库6.将新建好的文件夹初始化成本地仓库第一步:右键点击刚创建的本地仓库,然后点击GitBashHere第二步:在命令行里输入gitinit

热文推荐