[ADT笔记]图(graph)

news2024/11/19 19:28:52

定义

其实跟树差不多,但是树强调的是节点(data),图则既强调节点又强调边。

分类

  • 有向图(边有方向)
  • 无向图(边没方向)

例如,在无向图里<j,i>和<i,j>是同一条边。在有向图里<j,i>代表从节点j指向节点i的一条边,显然<j,i>和<i,j>就不是同一条边了。

术语

一个顶点所关联的边的数目。

有向图另外区分入度和出度。

  • 入度:以该顶点为终点的边的数目
  • 出度:以该顶点为起点的边的数目
  • 度:出度和入度之和

图中所有顶点度数之和等于边数的二倍。

完全图

图中每个顶点都有与其他所有顶点的连线,这意味着有向图每两个节点之间是有两条线,来回各一条。

k阶完全图有k*(k-1)/2条边

路径

路径就是顶点序列(由于一对顶点可以表示一条边,那么该序列相邻两个顶点就是一条边,整个序列就是多个边首尾相接),该序列含有的边的数目就是路径长度

若一条路径上除了开始点和结束点可以相同(注意,是可以,但未必一定得相同)外,其余顶点均不相同,则称此路径为简单路径

连通

在无向图G中若两个顶点之间有路径则称这两个顶点是连通的。

若无向图G中任意两个顶点都是连通的则称图G为连通图。

这里有点绕,其实就是说一个点不管经过多少路径能走到另一个点,就说这俩是连通的。


连通子图:

连通分量:指向图G中的极大连通子图。因此连通图的连通分量只有自身一个,而非连通图有多个


这里要对极大连通子图和极小连通子图饶舌一下:

  • 极大连通子图就是连通分量。
  • 极小连通子图是用最少的边实现所有的边连通。

上面说了两个顶点之间有路径则称这两个顶点是连通的,但是没说有多少路径(极大就是希望路径尽可能多)。对比看来,极大连通子图与极小连通子图相反,它要尽可能多地纳入原图的边,并且使这个图是连通的。

亦可以直接参考这篇文章讲的 图的连通

权和网

边带权的图叫做带权图,也叫做网(net)

生成树

最小生成树其实是最小权重生成树的简称

一个连通图的生成树是一个极小连通子图,其中含有图的全部顶点,和构成树的n-1条边。

强调连通图是因为要防止某些存在孤立无连接的顶点的特例

具体算法参见下方的基本运算

最小生成树和最短路的区别

最小生成树只是连通且保证边的权值之和最少,但是不保证任意两点之间是最短路径

最短路解决的问题是单源点的最短路径,它确保对于指定的点(源点)到任何其他点的距离最短。


处理最小生成树一般提到两种算法(具体内容均见后文):

  • Prim
  • Kruskal

两种方法结果是一样的,但是过程不太一样。

处理最短路问题一般提到两种算法(具体内容均见后文):

  • Dijkstra算法
  • Floyd算法

其中Floyd算法可以处理权值为负的情况

Dijkstra不可处理权值为负的情况,原因看下文

Dijkstra最短路径算法的权值不能为负及其原因

存储方法

往前想一想,学数据结构之前那些栈和队列的实现,都是围绕数组和链表两种结构实现的,图这种数据结构也不例外。

使用数组实现的叫做邻接矩阵存储方法,而使用链表实现的则是邻接表存储方法。

稠密图用邻接矩阵存储

稀疏图用邻接表存储

原因:首先明确邻接表是链表,这意味着本身存储效率就有损耗。因为有一部分空间用于表示指针域,即维护各节点之间的关系。存储效率=有用数据占用空间/总占用空间,非零节点是有用的数据,邻接表只存储非零节点,稀疏图零节点多。稠密图类似,零节点少,采用邻接矩阵。

邻接矩阵存储方法

邻接表存储方法

基本运算

遍历

最小生成树的算法

kruskal

在原无向带权图中选择一些边构成新的图(显然也是树),选的原则是:

  • 总选择权值最小的边加入作为结果的新图里
  • 若选择的边与此前已选择的边会构成环则弃而选权值次小的

Prim

看这篇文章讲的Prim算法

最短路

Dijkstra与Floyd

说实话文字叙述确实抽象,我的建议是看视频,而我恰好看到了这个视频讲的挺好的:

看这个B站视频讲的

拓扑序列

性质/要求:对于对于有边或路径<i,j>则在拓扑序列中必有i在j前面

前提:图是有向图。只有有向无环图才有拓扑序,所以有向无环图又被称为拓扑图。有向有环图也可以输出拓扑序,只是输出的顶点序列是该图所有顶点的一部分。

在一个有向图中找一个拓扑序列的过程称为拓扑排序

拓扑排序的步骤是:

  1. 从图中选一个没有前驱(入度为0)的顶点(如果有多个则任选1个)输出
  2. 在图中去掉该顶点和它延伸出去的所有边
  3. 然后重复上述步骤

(显然由上面的1可以知道)拓扑序列可能不唯一

这时候就不得不提AOV网(Activity on Vertex Network)与AOE网(Activity On Edge)

AOV与AOE

AOE网

AOVAOE
边表示先后顺序事件
顶点表示事件状态
边是否有权

AOV网是没有权值的,只是表示了事情的优先顺序,比如说上图(忽略掉边权值)可以看出来,先完成 V 1 V_1 V1才可以进行 V 2 V_2 V2 V 3 V_3 V3表示的内容

AOE网有权值,表示完成该边代表事件所对应的代价(如所需时间),那么比如说从 V 1 V_1 V1这个状态到 V 2 V_2 V2需要完成时间 a 1 a_1 a1,耗时3小时,这就是一种可能具有的含义。


在AOE网中,状态 a i a_i ai的解锁当且仅当其所有前驱节点解锁

比如说上图只有 V 2 V_2 V2 V 3 V_3 V3都完成了才能进行 V 4 V_4 V4

AOE示意图1
看下方的时间轴图,不用多说,立马明白关键路径(第一行)的意义

关键路径时间轴图

关键路径可以有多条

例如上图a1+a4+a8+a11也是

关键路径求法

ve与vl

显然对于某个关键事件ave(a)=vl(a)

定义是这样的:

ve(v)是源点xv所有路径的最大值,即

v l ( v ) = v e ( y ) − M A X { c ( p ) } vl(v)=ve(y)-MAX\{c(p)\} vl(v)=ve(y)MAX{c(p)}

参考

李春葆《数据结构教程》
图的连通,连通图,连通分量,强连通分量
浅谈什么是图拓扑排序
7.1 图的定义与基本术语(这位仁兄的数据结构专栏看起来还可以啊)

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

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

相关文章

(简单成功版本)Mysql配置my.ini文件

目录 一、背景 二、删除原有的mysql服务 三、初始化mysql 四、自行添加my.ini文件 五、新建mysql服务 六、启动mysql服务 七、设置数据库密码 7.1 登录mysql数据库 7.2 修改root用户密码 八、配置my.ini问题 一、背景 我在两台电脑上安装了MySQL Server 8.0&#xff0…

谈谈你对React的理解?

1、思路 讲讲概念、说用途、设计思路和原理、有什么优缺点 2、概念 一句话解释技术本质&#xff0c;React是javascript的UI库&#xff0c;通过组件化的方式解决视图层开发复用问题&#xff0c;本质是组件化框架。 viewfn(props) const A(props)><div>A</div&g…

java打包之jar和war为何出现又有什么区别

文章目录jar为什么诞生如何打jar包war为什么诞生如何打war包jar与war有什么区别jar与war的种类&#xff08;进阶&#xff09;参考资料jar为什么诞生 java工程有大量文件&#xff0c;在部署的时候需要向服务器上传大量文件&#xff0c;如果有了jar的话&#xff0c;只需上传一个…

鹅鹅鸭又崩了咋办?试试这5个方法

要说最近大火的游戏&#xff0c;鹅鹅鸭/鹅鸭杀绝对算一个。这种休闲策略游戏&#xff0c;还能跟朋友、家人约着一起玩。 不过最近很多玩家在玩鹅鹅鸭时都遇到闪退、卡顿、进不去等情况&#xff0c;虽然有太火爆服务器不稳定&#xff0c;服务器被攻击的原因&#xff0c;但有时候…

【机器学习之模型融合】Voting投票法基础理论

目录 1、认识模型融合&#x1f338; 2、模型融合和集成算法的区别&#x1f339; 3、常见模型融合方式&#x1f341; 4、投票法Voting&#x1f33f; 4.1、不同的投票方法&#x1f334; 1、认识模型融合&#x1f338; 在机器学习竞赛界&#xff0c;流传着一句话&#xff1a;…

redis基本数据结构使用与场景

string&#xff08;字符串&#xff09;用法使用场景list&#xff08;列表&#xff09;用法使用场景set&#xff08;不可重复&#xff0c;乱序的集合&#xff09;用法使用场景zset &#xff08;相对于set集合 增加了score属性&#xff0c;score可用于排序&#xff09;用法使用场…

持续集成:使用Jenkins API创建视图

持续集成&#xff1a;通过Jenkins API创建项目和节点介绍了使用jenkins API来创建项目和新建节点&#xff0c;jenkins API也可以创建视图&#xff08;view&#xff09;。 目录1. 获取视图配置文件2. 创建视图3. 将job添加到视图1. 获取视图配置文件 jenkins API创建视图&#…

Golang学习之路——之tinyrpc源码阅读

tinyrpc是一个高性能的基于protocol buffer的rpc框架。项目代码非常少&#xff0c;很适合初学者进行golang的学习。 如果你正在为没有资料学习发愁&#xff0c;文末有相关的学习资料获取方式 tinyrpc功能 tinyrpc基于TCP协议&#xff0c;支持各种压缩格式&#xff0c;基于pr…

Junit单元测试

Junit测试简介什么是单元测试单元测试是针对最小的功能单元编写测试代码Java程序最小的功能单元是方法单元测试就是针对单个Java方法的测试测试驱动开发(TDD)使用main()方法测试的缺点&#xff1a;只能有一个main()方法&#xff0c;不能把测试代码分离没有打印出测试结果和期望…

python+vue2+nodejs 搜索引擎课设 SCAU数信学院本科生通知检索(附源码)

前言 这个系统主要实现了以下功能&#xff1a; 爬虫&#xff1a;数据爬取及分词后端&#xff1a;数据库全文模糊搜索、高频词获取前端&#xff1a;输入拼音缩写或文字后匹配输入建议、搜索、列表分页、高亮关键词、相关度排序及时间排序、深色模式及浅色模式切换 爬虫&#x…

兔八哥与猎人

兔八哥与猎人 题目描述 兔八哥躲藏在树林旁边的果园里。果园有 MNM \times NMN 棵树&#xff0c;组成一个 MMM 行 NNN 列的矩阵&#xff0c;水平或垂直相邻的两棵树的距离为 111。兔八哥在一棵果树下。 猎人背着猎枪走进了果园&#xff0c;他爬上一棵果树&#xff0c;准备杀…

springboot整合JSR303校验

4.7 JSR303校验 4.7.1 统一校验的需求 前端请求后端接口传输参数&#xff0c;是在controller中校验还是在Service中校验&#xff1f; 答案是都需要校验&#xff0c;只是分工不同。 Contoller中校验请求参数的合法性&#xff0c;包括&#xff1a;必填项校验&#xff0c;数据…

Python_内置函数

1、abs()&#xff1a;绝对值 2、all()&#xff1a;接受一个可迭代对象&#xff0c;如果对象里的所有元素的bool运算值都是True&#xff0c;那么返回True,否则返回False 3、any()&#xff1a;接受一个可迭代对象&#xff0c;如果对象里有一个元素的bool运算值都是True&#xff0…

CSS实现从下至上弹出的抽屉动画

从下至上展开抽屉动画<!DOCTYPE html> <html><head><meta charset"UTF-8"><meta name"viewport" content"initial-scale1.0, maximum-scale1.0, user-scalableno" /><title></title><style>.co…

码农抓取商品详情API调用,Json和XML等格式

API 指的 是一些预定义的函数&#xff0c; 可以 提供给应用程序和开发人员基于软件或硬件访问一组例程的 功能 &#xff0c; 而 不再需要访问源代码或理解内部工作机制细节。 API 可以用于 于开发使用相同数据的其他应用程序&#xff0c;比如公司&#xff0c;他们可以创建一个A…

携手向前,欧拉沙龙双品牌联合运营纯电赛道再提速

面对波诡云谲的市场环境和竞争格局&#xff0c;企业只有不断变革&#xff0c;才能赢得更多的发展机遇&#xff0c;拥有属于自己的生存空间。 在2022年12月底广州国际车展和今年1月初的海口新能源车展上&#xff0c;欧拉携好猫、好猫GT、芭蕾猫、闪电猫&#xff0c;沙龙携高端车…

【Linux】-- 进程程序替换

目录 引入进程程序替换 进程程序替换 初步使用exec系列函数 原理分析 做一个简易的shell cd - 内置命令的理解 export - 环境变量的深入理解 引入进程程序替换 对于fork的学习让我们知道&#xff1a;fork()之后的&#xff0c;父子进程各自执行父进程代码的一部分。但是创…

IO初识233

绝对路径和相对路径 路径是用来描述一个文件在电脑上的具体位置。 这里的 E:\绘画合集\CCE展会logo 2.0就是绝对路径 目录之间的分隔符可以用\也可以用/来表示 相对路径就是以一个基准路径&#xff08;工作路径&#xff09;&#xff0c;以基准路径为起点往下走要怎么表示目标…

Java字符串训练

Java字符串训练一、用户登录二、统计字符次数三、拼接字符串1. 使用String2. 使用StringBuilder四、字符串反转五、金额转换六、手机号屏蔽七、身份证信息查看八、敏感词替换九、对称字符串十、数字转罗马数字十一、调整字符串十二、打乱字符串一、用户登录 需求&#xff1a;已…

MySQL监控(一):了解SigNoz

1.SigNoz介绍 github SigNoz SigNoz官方文档 2022 年 11 大 MYSQL 监控工具 MySQL | 六个最常用的 MySQL 数据库监控工具 2.SigNoz安装 从官方文档上得知使用以下命令进行安装&#xff1a; git clone -b main https://github.com/SigNoz/signoz.git && cd signoz/d…