搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
你好赵伟
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
现代循环神经网络(GRU、LSTM)(Pytorch 14)
2
微服务架构下,SpringCloud集成分布式文件存储中间件:FastDFS
3
id门禁卡复制到手机_使用iPhone解锁开门?手机复制门禁卡教程分享
4
java第一阶段 demo实例hashoperate及承抽象函数和实现接口_operate接口的实现类代码
5
用户分享 | 飞凌嵌入式i.MX9352开发板外设功能测试
6
面向 5G 的新型多载波传输技术比较_滤波组多载波技术特点和作用
7
合肥特殊教育中专学校计算机,安徽省特殊教育中专学校2021年招生简章
8
git如何拉取本地没有的远程分支_git fetch一个本地不存在的分支
9
一个缓存泛型自动处理队列,留有处理事件接口
10
【环境安装】nodejs 国内源下载与安装以及 npm 国内源配置
当前位置:
article
> 正文
【C 数据结构】图
作者:你好赵伟 | 2024-04-29 13:33:10
赞
踩
【C 数据结构】图
文章目录
【 1. 基本原理 】
1.1 无向图
1.2 有向图
1.3 基本知识
【 2. 图的分类 】
2.1 完全图
2.2 稀疏图和稠密图
2.3 连通图
2.3.1 (普通)连通图
连通图 - 无向图
非连通图 的 连通分量
2.3.2 强连通图
强连通图 - 有向图
非强连通有向图 的 强连通分量
2.3.3 生成树 - 连通图
2.3.4 生成森林 - 非连通图
不同存储结构对应的数据关系如下:
线性表:一对一
树:一对多
图:多对多
【 1. 基本原理 】
图存储结构可细分两种表现类型,分别为无向图和有向图。
1.1 无向图
下图所示为存储 V1、V2、V3、V4 的
无向图
结构,从图中可以清楚的看出数据之间具有的 多对多 关系。例如,V1 与 V4 和 V2 建立着联系,V4 与 V1 和 V3 建立着联系,以此类推。
与链表不同,图中存储的各个数据元素被称为
顶点
(而不是节点)。拿图 1 来说,该图中含有 4 个顶点,分别为顶点 V1、V2、V3 和 V4。
图存储结构中,习惯上用 Vi 表示图中的顶点,且所有顶点构成的集合通常用 V 表示,如上图中顶点的集合为 V={V1,V2,V3,V4}。
1.2 有向图
上图中仅是图存储结构的其中一种,数据之间 多对多 的关系还可用如下图所示的
有向图
结构表示:
可以看到,各个顶点之间的关系并不是 双向 的。比如,V4 只与 V1 存在联系(从 V4 可直接找到 V1),而与 V3 没有直接联系;同样,V3 只与 V4 存在联系(从 V3 可直接找到 V4),而与 V1 没有直接联系,以此类推。
在有向图中,每条路径或回路都是有方向的。
1.3 基本知识
(V1,V2) 和 <V1,V2> 的区别
无向图
中描述两顶点(V1 和 V2)之间的关系可以用
(V1,V2)
来表示。
有向图
中描述从 V1 到 V2 的"单向"关系用
<V1,V2>
来表示。
边和弧
由于图存储结构中顶点之间的关系是用线来表示的,因此 (V1,V2) 还可以用来表示
无向图中连接 顶点V1 和 顶点V2 的线
,又称为
边
;同样,<V1,V2> 也可用来表示
有向图中从 V1 指向 V2 的箭头
,称为
弧
,箭头所在的一端称为
弧头
,另一端称为
弧尾
。
弧头和弧尾
有向图中,无箭头一端的顶点通常被称为
初始点
或
弧尾
,箭头直线的顶点被称为
终端点
或
弧头
。
入度和出度
对于有向图中的一个顶点 V 来说,箭头指向 V 的弧的数量为 V 的
入度
(InDegree,记为 ID(V));箭头远离 V 的弧的数量为 V 的
出度
(OutDegree,记为OD(V))。拿上图中的顶点 V1来说,该顶点的入度为 1,出度为 2(该顶点的度为 3)。
集合 VR 的含义
一般用 VR 表示图中所有顶点之间关系的集合。例如,上面的无向图的集合 VR={(v1,v2),(v1,v4),(v1,v3),(v3,v4)},上面有向图的集合 VR={<v1,v2>,<v1,v3>,<v3,v4>,<v4,v1>}。
路径和回路
无论是无向图还是有向图,从一个顶点到另一顶点途径的所有顶点组成的序列(包含这两个顶点),称为一条
路径
。
如果路径中第一个顶点和最后一个顶点相同,则此路径称为
回路
或
环
。
若路径中各顶点都不重复,此路径又被称为
简单路径
;同样,若回路中的顶点互不重复,此回路被称为
简单回路
或
简单环
。
拿上面的无向图 来说,从 V1 存在一条路径还可以回到 V1,此路径为 {V1,V3,V4,V1},这是一个回路(环),而且还是一个简单回路(简单环)。
权和网
在某些实际场景中,图中的每条边(或弧)会赋予一个实数来表示一定的含义,这种与边(或弧)相匹配的实数被称为
权
,而带权的图通常称为
网
。如下图所示,就是一个网结构:
子图
由图中一部分顶点和边构成的图,称为原图的
子图
。
【 2. 图的分类 】
根据不同的特征,图又可分为完全图,连通图、稀疏图和稠密图等。
2.1 完全图
完全图:若图中各个顶点都与除自身外的其他顶点有关系,这样的无向图称为
完全图
(如下图a)。同时,满足此条件的有向图则称为
有向完全图
(如下图b),即
顶点两两之间可以
直接
连通
。
具有 n 个顶点的完全图,图中边的数量为 n(n-1)/2;而对于具有 n 个顶点的有向完全图,图中弧的数量为 n(n-1)。
2.2 稀疏图和稠密图
稀疏图和稠密图:这两种图是相对存在的,即如果图中具有很少的边(或弧),此图就称为
稀疏图
;反之,则称此图为
稠密图
。
稀疏和稠密的判断条件
e<nlogn,其中 e 表示图中边(或弧)的数量,n 表示图中顶点的数量,即
边的数量<nlog(顶点的数量)
,如果式子成立,则为稀疏图;反之为稠密图。
2.3 连通图
2.3.1 (普通)连通图
连通图 - 无向图
图中从一个顶点到达另一顶点,若存在至少一条路径,则称这两个顶点是
连通
的,即
顶点两两之间可以通过路径通着
。
例如下图中,虽然 V1 和 V3 没有直接关联,但从 V1 到 V3 存在两条路径,分别是 V1-V2-V3 和 V1-V4-V3,因此称 V1 和 V3 之间是连通的。
无向图中,如果任意两个顶点之间都能够连通,则称此无向图为
连通图
。
例如,下图中的无向图就是一个连通图,因为此图中任意两顶点之间都是连通的。
非连通图 的 连通分量
若无向图不是连通图,但图中存储某个子图符合连通图的性质,则称该子图为(非连通图的)
连通分量
。
连通分量的提出是以 整个无向图不是连通图 为前提的,因为如果无向图是连通图,则其无法分解出多个最大连通子图,因为图中所有的顶点之间都是连通的。
前面讲过,由图中部分顶点和边构成的图为该图的一个子图,但这里的子图指的是图中 最大 的连通子图(也称
极大连通子图
)。
如下图所示,虽然下图 a 中的无向图不是连通图,但可以将其分解为 3 个 最大子图(下图 b),它们都满足连通图的性质,因此都是连通分量。下图 a 中的无向图只能分解为 3 部分各自连通的 最大子图。
2.3.2 强连通图
强连通图 - 有向图
有向图
中,若任意两个顶点 Vi 和 Vj,满足从 Vi 到 Vj 以及从 Vj 到 Vi 都连通,也就是都含有至少一条通路,则称此有向图为
强连通图
,即
有向图中两两顶点都是通着的
。如下图所示就是一个强连通图。
非强连通有向图 的 强连通分量
与此同时,若有向图本身不是强连通图,但其包含的最大连通子图具有强连通图的性质,则称该子图为
强连通分量
。
如下图所示,整个有向图虽不是强连通图,但其含有两个强连通分量。
连通图是在无向图的基础上对图中顶点之间的连通做了更高的要求
,
而
强连通图是在有向图的基础上对图中顶点的连通做了更高的要求
。
2.3.3 生成树 - 连通图
对连通图进行遍历,过程中所经过的边和顶点的组合可看做是一棵普通树,通常称为
生成树
。
连通图中的生成树必须满足以下 2 个条件:
① 包含连通图中所有的顶点;
② 任意两顶点之间有且仅有一条通路;
因此,连通图的生成树具有这样的特征,即生成树中边的数量 = 顶点数 - 1。
如下图所示,下图 a 是一张连通图,下图 b 是其对应的 2 种生成树。
连通图中,由于任意两顶点之间可能含有多条通路,遍历连通图的方式有多种,往往
一张连通图可能有多种不同的生成树与之对应
。
2.3.4 生成森林 - 非连通图
生成树是对应连通图来说,而生成森林是对应非连通图来说的
。
非连通图可分解为多个连通分量,而每个连通分量又各自对应多个生成树(至少是 1 棵),因此与整个非连通图相对应的,是由多棵生成树组成的
生成森林
。
如上图所示,这是一张非连通图,可分解为 3 个连通分量,其中各个连通分量对应的生成树如下图所示:
(下图中列出的仅是各个连通分量的其中一种生成树。)
因此,多个连通分量对应的多棵生成树就构成了整个非连通图的生成森林。
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/你好赵伟/article/detail/508007
推荐阅读
article
【
数据结构
】
哈希
表
的
创建、
查找
(C语言实现)_再编写
一个
函数
,
实现
哈希
表
的
造
表
和
查找
操作。...
本次
的
实验要求弄清楚最关键
的
两个模块,即插入和
查找
,首先要有
哈希
函数
生成映射地址、有
哈希
表
保存元素,然后要有自己设定
的
解...
赞
踩
article
【
数据结构
】
插值
排序...
插值
排序(Interpolation Search)是一种用于在有序数组中查找特定元素的搜索算法。它是二分查找算法的改进...
赞
踩
article
【
数据结构
】模拟
实现
顺序
表
...
ArrayList是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般是用数组完成的。ArrayList底层是...
赞
踩
article
【C语言
数据结构
】
线性
表
-
顺序
表
的实现_c语言构建
线性
顺序
表
...
顺序
表
是用一段物理地址连续的存储单元依次存储数据元素的
线性
结构,一般情况下采用数组存储,并在数组上完成数据的增、删、查、...
赞
踩
article
<
数据结构
> (C语言
实现
)
动态
顺序
表
...
1.线性
表
线性
表
是n个具有相同特性的数据元素的有限序列。常见的线性
表
:
顺序
表
、链
表
、栈、队列、字符串......线性
表
在...
赞
踩
article
【
数据结构
】
时间
复杂度
的
例题
...
【
数据结构
】
时间
复杂度
的
例题
...
赞
踩
article
【
数据结构
】
二叉树
(定义、性质、
存储
、
遍历
、
构造
)解析+完整代码...
定义1.每个结点至多有两棵子树;2.左右子树不能颠倒(
二叉树
是有序树)。特殊
二叉树
1.满
二叉树
一棵高度为h,且含有2h−...
赞
踩
article
C语言【
数据
结构
】
顺序
表
(动态开辟)实现_
c
语言
的
结构
体 开辟空间...
前言:这是
数据
结构
的
开始,
顺序
表
。现在已经开始学
数据
结构
了,学
数据
结构
最重要
的
3点是①善于画图,多画图思考②一定要细心③...
赞
踩
article
【
数据结构
】图的应用(
最小
生成
树、
拓扑
排序
、
最短
路径等)...
本文章介绍
数据结构
中的图的应用,包括
最小
生成
树的Prim算法和Kruskal算法,
拓扑
排序
和
最短
路径,且还包含408习题...
赞
踩
article
数据结构
(
并
查集
,
ST
表)...
【代码】
数据结构
(
并
查集
,
ST
表)
数据结构
(
并
查集
,
ST
表)
并
...
赞
踩
article
数据结构
:
树
的
分类及在
数据库
索引
中
的
运用
...
树
数据库
索引
b
树
b+
树
数据结构
:
树
的
分类及在
数据库
索引
中
的
运用
...
赞
踩
article
数据结构
-图
搜索算法
详解...
图
搜索算法
是
数据结构
和算法学科中的一个重要领域,它们用于在图中搜索顶点(节点)和边(连接节点的线)。图可以是有向的(边有...
赞
踩
article
数据结构
––
复杂度
...
是一个数学表达式,是对一个算法在运行过程中临时占用额外存储空间大小的量度空间
复杂度
不是程序占用了多少bytes的空间,因...
赞
踩
article
数据结构
---
线性
表
(
顺序
表
)附代码...
假定数组有10个空间,已经使用了5个,向数组中插入数据步骤: 求数组的长度,求数组的有效数据个数,向下标为数据有效个数的...
赞
踩
article
【
C
/
C
++
数据结构
线性表】深入
理解
与
实现
栈
:从基础到
应用
的全面探索...
栈
(Stack)是一种特殊的线性
数据结构
,它只允许在一端进行插入和删除操作。这一端通常被称为“
栈
顶”(Top),而另一端...
赞
踩
article
数据结构
––
串
...
由一个或多个称为空格的特殊字符组成的
串
(长度是空格字符的个数):子
串
的定位运算,是一种子
串
在主
串
中第一次出现的第一个字符...
赞
踩
article
《
数据结构
》之八
大
排序
_
从小到
大
排序
是
大
根堆
还
是
小
根堆
...
八
大
排序
---结合基本思想,代码,图解,重点分析,进行详细讲解!!_
从小到
大
排序
是
大
根堆
还
是
小
根堆
从小到
大
排序
是
大
根堆
还...
赞
踩
article
数据结构
:
排序
-
插入
排序
(
插入
排序
and
希尔
排序
) ,
选择
排序
(
选择
排序
and
堆
排序
) , 交换...
数据结构
:
排序
-
插入
排序
(
插入
排序
and
希尔
排序
) ,
选择
排序
(
选择
排序
and
堆
排序
) , 交换
排序
(
冒泡
排序
and
...
赞
踩
article
Java【
数据结构
】
二分
查找
_
java
二分
查找
...
right=arr.length,作为一个边界存在,left可能为我们的
查找
目标,但是right一定不是我们要找到的目标...
赞
踩
article
数据结构
-----
二叉
排序树...
今天我们继续学习新的知识点----排序
二叉
树,在此之前我们学习了相关的排序算法,给你一个数组,然后对这个数组进行排序。那...
赞
踩
相关标签
数据结构
c语言
散列表
算法
java
ArrayList
顺序表
链表
c#
开发语言
c++
b树
笔记
学习
蓝桥杯
图论
考研