【C 数据结构-图】1. 图的相关基础

本文详细介绍了图的基本原理,包括无向图和有向图的存储结构,以及连通图、完全图、稀疏图和稠密图等分类。着重讲解了连通分量、生成树、生成森林、强连通图和重连通图的概念,并探讨了这些概念在通信网络、航空网和军事补给等实际应用中的意义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 不同存储结构对应的数据关系如下:
    • 线性表:一对一
    • 树:一对多
    • 图:多对多

【 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 之间是连通的。
    在这里插入图片描述
  • 无向图中,如果任意两个顶点之间都能够连通,则称此无向图为 连通图,即 无向图中任意两顶点可以通过路径 直接或间接 通着
    例如,下图中的无向图就是一个连通图,因为此图中任意两顶点之间都是连通的。
    在这里插入图片描述

2.3.2 连通分量

  • 若无向图不是连通图,则称为 非连通图,若非连通图图中存储某个子图符合连通图的性质,则称该子图为 非连通图的 连通分量。(这里的子图指的是图中 最大 的连通子图,也称 极大连通子图
  • 如下图所示,虽然下图 a 中的无向图不是连通图,但可以将其分解为 3 个 最大子图(下图 b),它们都满足连通图的性质,因此都是连通分量。下图 a 中的无向图只能分解为 3 部分各自连通的 最大子图。
    在这里插入图片描述

2.3.3 生成树

  • 对连通图进行遍历,过程中所经过的边和顶点的组合可看做是一棵普通树,通常称为 生成树
  • 连通图中的生成树必须满足以下 2 个条件:
    ① 包含连通图中所有的顶点;
    ② 任意两顶点之间有且仅有一条通路;
  • 因此,连通图的生成树具有这样的特征,即生成树中边的数量 = 顶点数 - 1。
  • 如下图所示,下图 a 是一张连通图,下图 b 是其对应的 2 种生成树。

在这里插入图片描述

  • 连通图中,由于任意两顶点之间可能含有多条通路,遍历连通图的方式有多种,往往 一张连通图可能有多种不同的生成树与之对应

2.3.4 生成森林

  • 生成树是对应连通图来说,而生成森林是对应非连通图来说的
  • 非连通图可分解为多个连通分量,而每个连通分量又各自对应多个生成树(至少是 1 棵),因此与整个非连通图相对应的,是由多棵生成树组成的 生成森林
    在这里插入图片描述
  • 如上图所示,这是一张非连通图,可分解为 3 个连通分量,其中各个连通分量对应的生成树如下图所示:
    (下图中列出的仅是各个连通分量的其中一种生成树。)
    在这里插入图片描述
  • 因此,多个连通分量对应的多棵生成树就构成了整个非连通图的生成森林。

2.4 强连通图

2.4.1 强连通图

  • 有向图 中,若任意两个顶点 Vi 和 Vj,满足从 Vi 到 Vj 以及从 Vj 到 Vi 都连通,也就是都含有至少一条通路,则称此有向图为 强连通图 ,即 有向图中任意两顶点都是直接通着的 。如下图所示就是一个强连通图。
    在这里插入图片描述

2.3.4 强连通分量

  • 与此同时,若有向图本身不是强连通图,但其包含的最大连通子图具有强连通图的性质,则称该子图为 强连通分量
    如下图所示,整个有向图虽不是强连通图,但其含有两个强连通分量。
    在这里插入图片描述
  • 连通图是在无向图的基础上对图中顶点之间的连通做了更高的要求强连通图是在有向图的基础上对图中顶点的连通做了更高的要求

2.5 重连通图

2.5.1 重连通图 基本原理

  • 在无向图中,如果 任意两个顶点之间含有不止一条通路,这个图就被称为 重连通图 。在重连通图中,在删除某个顶点及该顶点相关的边后,图中各顶点之间的连通性也不会被破坏。
  • 在一个无向图中,如果删除某个顶点及其相关联的边后,原来的图被分割为两个及以上的连通分量,则称该顶点为无向图中的一个 关节点 或者 割点
  • 例如,下图就是一个连通图 但不是 重连通图,图中有4个关节点,分别是:A、B、D 和 G。
    在这里插入图片描述
  • 删除顶点 B 及相关联的边后,原图就变为了下图:
    可以看到,图被分割为各自独立的 3 部分,顶点集合分别为:{A、C、F、L、M、J}、{G、H、I、K} 和 {D、E}。
    在这里插入图片描述
  • 重连通图其实就是没有关节点的连通图。在重连通图中,只删除一个顶点及其相关联的边,肯定不会破坏其连通性。如果一味地做删除顶点的操作,直到删除 K 个顶点及其关联的边后,图的连通性才遭到破坏,则称此重连通图的 连通度 为 K 。

2.5.2 判断重连通图的方法

  • 任意一个连通图都可以通过深度优先搜索算法获得一棵深度优先生成树。例如,将下图通过深度优先搜索获得深度优先生成树:
    在这里插入图片描述

  • 上图的深度优先生成树如下图所示:
    虚线表示遍历生成树时未用到的边,简称 回边 。也就是图中有,但是遍历时没有用到,于是在生成树中用虚线表示出来。
    在这里插入图片描述

  • 在深度优先生成树所表示的图的关节点有两种特性:
    ① 首先判断整棵树的树根结点,如果树根有两条或者两条以上的子树,则该顶点肯定是关节点。因为一旦树根丢失,生成树就会变成森林。
    ② 然后判断生成树中的每个非叶子结点,以该结点为根结点的每棵子树中如果有结点的回边与此非叶子结点的祖宗结点相关联,那么此非叶子结点就不是关节点;反之,就是关节点。
    注意:必须是和该非叶子结点的祖宗结点(不包括结点本身)相关联,才说明此结点不是关节点。

  • 判断一个图是否是重连通图,也可以转变为:判断图中是否有关节点,如果没有关节点,证明此图为重连通图;反之则不是。

拿上图的生成树来说,利用两个特性判断每个顶点是否为关节点:

  • 首先,判断树根结点 A ,由于有两个孩子,也就是有两棵子树,所以 A 是关节点。然后判断树中所有的非叶子结点,也就是: L 、 M 、 B 、 D 、 H 、 K 、 G ;
  • L 结点为根结点的子树中 B 结点有回边直接关联 A ,所以, L 不是关节点;
  • 在以 M 结点为树根的子树中,J 结点和 B 结点都有回边关联 M 结点的祖宗结点,所以,M 不是关节点;
  • 以 B 结点为根结点的 3 棵子树中,只有一棵子树(只包含结点 C )与 B 结点的祖宗结点 A 有关联,其他两棵子树没有,所以结点 B 是关节点;
  • 以 D 结点为根结点的子树中只有结点 E,且没有回边与祖宗结点关联,所以,D 是关节点;
  • 以 H 结点为根结点的子树中, G 结点与 B 结点关联,所以, H 结点不是关节点;
  • K 结点和 H 结点相同,由于 G 结点与祖宗结点 B 关联,所以 K 结点不是关节点;
  • 以 G 结点为根结点的子树中只有一个结点 I,没有回边,所以结点 G 是关节点;
  • 综上所述,上图中的关节点有 4 个,分别是: A 、 B 、 D 、 G 。

2.5.3 重连通图的应用

  • 如今的通信网络对人们的生活有着重要的影响,如果将通信网络比做一个巨大的连通图的话,它的连通度 K 值越高,证明其稳定性越好,即使某一个站点发生故障无法工作也不会影响整个系统的正常工作。
  • 同样,小到城市之间,大到国家之间的航空网也可以看作是一个连通图,但如果此图建设成为重连通图,当某条航线因为天气等因素关闭时,飞机仍可以从别的航线到达目的地。
  • 在战争中,有“兵马未动,粮草先行”的说法,可见后勤补给对军队的重要性。如果补给线是一个重连通图,就不用过于担心补给线被破坏的问题,因为即使破坏一条,还有其它的,只要连通度足够大。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MR_Promethus

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值