当前位置: 首页 > news >正文

第八章--图

定义

类比前面所学的线性表和树,图就是多对多的关系。

再详细点的定义就是:图由顶点集合V(G)和边集合E(G)组成。顶点集合V(G)是一组元素的集合,这些元素称为顶点(或节点);边集合E(G)是由顶点对组成的集合,这些顶点对表示顶点之间的关系,称为边。

相关概念 

有向图:边有方向。

无向图:边无方向。

加权图:每条边都赋予一个权重(可以是表示距离、成本、时间等的数值)。

子图:设 G=(V,E) 是一个图,G'=(V',E'),如果V' \subseteq V且E' \subseteq E,则称 G' 是 G 的子图。

例如:

邻接:顶点间有边相连,称顶点间有邻接关系。

出度、入度与度:有向图中一个点的出度是指由该顶点射出的有向边的条数,入度就是射入该顶点的条数du;对于无向图,度就是邻接于该点的边的总数

简单图:一种特殊的无向图,1)图中没有自环,即不存在一条边的两个端点是同一个顶点;2)图中任意两个顶点之间最多只有一条边相连

多重图:允许存在平行边的图,即图中可以有多个边连接同一对顶点;允许多重图存在自环。

无向完全图:无向图中任意两个不同的顶点之间都存在一条无向边,边数为C_{n}^{2}=n(n-1)/2

有向完全图:边数为P_{n}^{2}=n(n-1)

路径:在图G=(V,E)中,从顶点 v_0 到顶点 v_n 的路径是一个顶点序列v_0, v_1, v_2, \cdots, v_n,使得对于 i = 0, 1, \cdots, n - 1(v_i, v_{i + 1}) 是图G中的边。如果图是有向图,那么路径中的边必须按照箭头所指的方向依次连接。路径可以分为简单路径和基本路径。简单路径是指路径中所有的边都不相同基本路径是指路径中所有的顶点都不相同(除了起点和终点可能相同)。

回路:一条特殊的路径,它的起点和终点是同一个顶点。回路也可分为简单回路和基本回路。简单回路是指回路中所有的边都不相同基本回路是指除了起点和终点相同外,其余顶点都不相同的回路。

图的存储方式

邻接矩阵表示法

直接看图:顶点用一维数组存储,矩阵上的索引代表顶点,矩阵里存储的信息代表边(1为二者有连线否则无关联)

主要是看行标。

加权邻接矩阵表示法

其实与邻接矩阵表示法没什么太大区别,不过是把矩阵里存储的信息改为权值,有权值则一定有边,无穷则代表无边。

邻接表

顶点依然用一维数组存储,边由同一个顶点出发的所有边组成的一条单链表。

逆邻接表

顶点保存该顶点的射入边形成的单链表的首节点地址。

图的遍历

访问邻接点:

1、DFS--栈(深度优先)

2、BFS--队列(广度优先)

连通图

无向图的连通性

连通图:在无向图中,如果从顶点u到顶点v存在路径,则称顶点u和v是连通的。如果图中任意两个顶点都是连通的,那么这个无向图就被称为连通图。

连通分量:非连通图可以分解为多个连通的子图,这些极大连通子图称为连通分量。

有向图的连通性

强连通图:在有向图中,如果对于任意两个顶点u和v,既存在从u到v的路径,又存在从v到u的路径,则称该有向图是强连通图(意思就是双向的)。

强连通分量:非强连通的有向图可以划分为多个极大强连通子图,这些子图称为强连通分量

弱连通图:如果忽略有向图中边的方向后得到的无向图是连通的,则称该有向图为弱连通图(意思就是单向的)。

图的连通性判定方法

1)对于无向图,可以使用深度优先搜索(DFS)或广度优先搜索(BFS)算法从任意一个顶点出发,遍历图中的所有顶点。如果能够访问到图中的所有顶点,那么该图是连通图;否则,图是非连通图。

2)对于有向图,判定强连通性可以通过计算图的强连通分量来实现。常用的算法有 Kosaraju 算法Tarjan 算法等。这些算法通过对图进行深度优先搜索,利用顶点的访问顺序和回溯信息来识别强连通分量。


小结

  1. 图的定义:图由顶点集合 V(G) 和边集合 E(G) 组成,体现多对多关系,顶点集合是元素集合,边集合由顶点对组成表示顶点关系。
  2. 相关概念
    • 图的类型:有向图边有方向,无向图边无方向,加权图每条边有权重,子图满足顶点和边集合分别是原图的子集。
    • 顶点关系:顶点间有边相连为邻接;有向图顶点有出度(射出边条数)和入度(射入边条数),无向图顶点的度是邻接边总数。
    • 图的种类:简单图无自环且顶点间最多一条边;多重图允许平行边和自环;无向完全图任意两不同顶点有边相连;有向完全图任意两不同顶点有双向边。
    • 路径与回路:路径是顶点序列,有向图路径边按方向连接,分简单路径(边不同)和基本路径(顶点不同,起点终点可同);回路是起点终点相同的路径,分简单回路(边不同)和基本回路(除起点终点相同外顶点不同)。
  3. 图的存储方式
    • 邻接矩阵表示法:顶点用一维数组存储,矩阵索引代表顶点,矩阵存储边信息(1 表示有连线,0 表示无关联)。
    • 加权邻接矩阵表示法:与邻接矩阵类似,矩阵存储边的权值,无穷表示无边。
    • 邻接表:顶点用一维数组存储,边由同一顶点出发的边组成单链表。
    • 逆邻接表:顶点保存射入边形成的单链表首节点地址。
  4. 图的遍历:包括深度优先搜索(DFS,借助栈)和广度优先搜索(BFS,借助队列),用于访问邻接点。
  5. 图的连通性
    • 无向图:任意两顶点有路径则为连通图,非连通图的极大连通子图是连通分量。
    • 有向图:任意两顶点有双向路径为强连通图,非强连通图的极大强连通子图是强连通分量;忽略边方向后无向图连通的是弱连通图。
  6. 图的连通性判定方法
    • 无向图:用 DFS 或 BFS 从任一顶点遍历,能访问所有顶点则为连通图。
    • 有向图:用 Kosaraju 算法、Tarjan 算法等计算强连通分量判定强连通性 。

今天的分享就到这里啦~~

相关文章:

  • 在 Ubuntu 下使用 ESP-IDF 通过串口烧录 ESP32
  • 【日撸 Java 三百行】Day 3(注释,基本if语句,函数调用)
  • C++编程语言:从高效系统开发到现代编程范式的演进之路
  • 对标研华ECU-461,搭载飞腾4核/8核国产处理器, 提供8网 8串B码对时 双显 无风扇的ARM通信管理平台
  • 优势演员-评论家A2C详解:python从零实现
  • Cyber Weekly #54
  • 小程序问题(记录版)
  • spring详解-循环依赖的解决
  • 如何通过代理 IP 实现异地直播推流
  • 荣耀A8互动娱乐组件部署实录(第1部分:服务端环境搭建)
  • Android开发-工程结构
  • HarmonyOS基本的应用的配置
  • 编程日志4.25
  • Messenger.Default.Send 所有重载参数说明
  • imapal sql优化之hint
  • 获取当前时间
  • Unity中Pico4开发 物体跟随手势模型进行移动
  • 解释 NestJS 的架构理念(例如,模块化、可扩展性、渐进式框架)
  • 使用 git subtree 方法将六个项目合并到一个仓库并保留提交记录
  • Ubuntu18.04搭建samda服务器
  • 明天起,沪苏湖高铁、杭温高铁推出13款新型票制产品
  • 外交部:应美方请求举行贸易代表会谈,中方反对美滥施关税立场没有变化
  • 央行:5月8日起,下调个人住房公积金贷款利率0.25个百分点
  • 习近平致电祝贺默茨当选德国联邦总理
  • 上海乐高乐园明天正式开售年卡,下月开启试运营
  • 独家专访|白先勇:我的家乡不是哪个地点,是中国传统文化