第六章 图--以下代码由C语言实现

王道学习

考纲内容

(一)图的基本概念
(二)图的存储及基本操作
           邻接矩阵;邻接表;邻接多重表;十字链表
(三)图的遍历
           深度优先搜索;广度优先搜索
(四)图的基本应用
           最小(代价)生成树;最短路径;拓扑排序;关键路径

知识框架

在这里插入图片描述

复习提示

        图算法的难度较大,主要掌握深度优先搜索与广度优先搜索。掌握图的基本概念及基本性质、图的存储结构(邻接矩阵、邻接表、邻接多重表和十字链表)及特性、存储结构之间的转化、基于存储结构上的各种遍历操作和各种应用(拓扑排序、最小生成树、最短路径和关键路径)等。图的相关算法较多,通常只需掌握其基本思想和实现步骤,而实现代码不是重点。

6.1 图的基本概念

6.1.1 图的定义

在这里插入图片描述
注意:线性表可以是空表,树可以是空树,但图不可以是空图。就是说,图中不能一个顶点也没有,图的顶点集V一定非空,但边集E可以为空,此时图中只有顶点而没有边。
1、无向图、有向图
在这里插入图片描述
2、简单图、多重图
在这里插入图片描述
3、顶点的度–入度、出度
在这里插入图片描述
4、顶点–顶点的关系描述
在这里插入图片描述
5、连通图、强连通图
在这里插入图片描述
6、子图
在这里插入图片描述

在这里插入图片描述
7、连通分量
在这里插入图片描述
8、强连通分量
在这里插入
9、生成树
在这里插入图片描述
10、生成森林
在这里插入图片描述
11、边的权、带权图/网
在这里插入图片描述
12、几种特殊形态的图
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6.1.2 本节试题精选

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

在这里插入图片描述

6.2 图的存储及基本操作

6.2.1 邻接矩阵法

数组实现的顺序存储,空间复杂度高,不适合存储稀疏图
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意:
(1)在简单应用中,可直接用二维数组作为图的邻接矩阵(顶点信息等均可省略)。
(2)当邻接矩阵中的元素仅表示相应的边是否存在时,EdgeType可定义为值为0和1的枚举类型。
(3)无向图的邻接矩阵是对称矩阵,对规模特大的邻接矩阵可采用压缩存储。
(4)邻接矩阵表示法的空间复杂度为O(n的平方),其中n为图的顶点树|V|

6.2.2 邻接表法

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
图的邻接表存储方法具有一下特点:
(1)若G为无向图,则需要的存储空间为O(|V|+2|E|);若G为有向图,则所需的存储空间为O(|V|+|E|)。前者的倍数2是由于无向图中,每条边在邻接表中出现了两次。
(2)对于稀疏图,采用邻接表表示将极大地节省存储空间。
(3)在邻接表中,给定一顶点,能很容易地找出它的所有邻边,因为只需要读取它的邻接表。在邻接矩阵中,相同的操作则需要扫描一行,花费的时间为O(n)。但是,若要确定给定的两个顶点建是否存在边,则在邻接矩阵中可以立刻查到,而在邻接表中则需要在相应结点对应的边表中查找另一结点,效率较低。
(4)在有向图的邻接表表示中,求一个给定顶点的出度只需计算其邻接表中的结点个数;但求其顶点的入度则需要遍历全部的邻接表。因此,也有人采用逆邻接表的存储方式来加速求解给定顶点的入度。当然,这实际上与邻接表存储方式是类似的。
(5)图的邻接表表示并不唯一,因为在每个顶点对应的单链表中,各边结点的链接次序可以是任意的,它取决于建立邻接表的算法及边输入的次序。

6.2.3 十字链表存储有向图

在这里插入图片描述

在这里插入图片描述

6.2.4 邻接多重表存储无向图

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

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

在这里插入图片描述

6.2.5 图的基本操作

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

在这里插入图片描述

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

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


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

6.3 图的遍历

        图的遍历是指从图中的某一顶点出发,按照某种搜索方法沿着图中的边对图中的所有顶点访问一次,且仅访问一次。注意到树是一种特殊的图,所以树的遍历实际上也可视为一种特殊的图的遍历。图的遍历算法是求解图的连通性问题、拓扑排序和求关键路径等算法的基础。

6.3.1 广度优先遍历–BFS

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

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

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

6.3.2 深度优先遍历–DFS

在这里插入图片描述

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

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

在这里插入图片描述

6.3.3 图的遍历与图的连通性

        图的遍历算法可以用来判断图的连通性。对于无向图来说,若无向图是连通的,则从任意一个结点出发,仅需一次遍历就能够访问图中的所有顶点;若无向图是非连通的,则从某一个顶点出发,一次遍历只能访问到该顶点所在连通分量的所有顶点,而对于图中其他连通分量的顶点,则无法通过这次遍历访问。对于有向图来说,若从初始顶点到图中的每个顶点都有路径,则能够访问到图中的所有顶点,否则不能访问到所有顶点。

在这里插入图片描述

6.3.4 本节试题精选

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

6.4 图的应用

        本节是历年考查的重点。图的应用主要包括:最小生成(代价)树、最短路径、拓扑排序和关键路径。一般而言,这部分内容直接以算法设计题形式考查的可能性极小,而更多的是结合图的实例来考查算法的具体操作过程,读者必须学会手工模拟给定图的各个算法的执行过程。此外,还需掌握对给定模型建立相应的图去解决问题的方法。

6.4.1 最小生成树

        一个连通图的生成树包含图的所有顶点,并且只含尽可能少的边。对于生成树来说,若砍去它的一条边,则会使生成树变成非连通图;若给它增加一条边,则会形成图中的一条回路。

        对于一个带权连通无向图G=(V,E),生成树不同,每棵树的权(即树中所有边上的权值之和)也可能不同。设A为G的所有生成树的集合,若T为A中边的权值之和最小的那颗生成树,则T称为G的最小生成树(Minimum-Spanning-Tree,MST)。

        不难看出,最小生成树具有如下性质:
        1)最小生成树不是唯一的,即最小生成树的树形不唯一,A中可能有多个最小生成树。当图G中的各边权值互不相等时,G的最小生成树是唯一的;若无向连通图G的边数比顶点数少1,即G本身是一棵树时,则G的最小生成树就是它本身。
        2)最小生成树的边的权值之和总是唯一的,虽然最小生成树不唯一,但其对应的边的权值之和总是唯一的,而且是最小的。
        3)最小生成树的边数为顶点数减1。

        Prim算法和Kruskal算法,都基于贪心算法的策略。
在这里插入图片描述

1、Prim算法
在这里插入图片描述

在这里插入图片描述

2、Kruskal算法
在这里插入图片描述

在这里插入图片描述

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

Prim算法实现思想

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

//Prim算法思想自我总结
/*首先初始化,
  初始化两个数组isJoin和lowCost,
  将V0的isJoin标记为TRUE,
  然后更新与V0连接的所有顶点的lowCost,初始化完成
*/
//接下来开始循环
for(i=0;i<=顶点数-1;i++){
/*每次循环:
  首先循环lowCost数组,找到最小的且还没有加入数的顶点。找到了V3,将V3的isJoin标记为TRUE。
  再次循环lowCost数组,更新还没加入的各个顶点的lowCost值。将于V3连接的所有顶点,与V0连接的所有顶点的lowCost对比,更新lowCost数组。
  一次循环完成。
*/
/*接下来再次循环,循环类似。*/
}

Kruskal算法实现思想

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

使用并查集判断两个顶点是否属于同一集合

6.4.2 最短路径

在这里插入图片描述

BFS算法

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

Dijkstra算法

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

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

Floyd算法

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

6.4.3 有向无环图–描述表达式

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

6.4.4 拓扑排序

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

在这里插入图片描述

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

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

6.4.5 关键路径


















在这里插入图片描述

6.4.6 本节试题精选

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

在这里插入图片描述

  • 13
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

李贺梖梖

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

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

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

打赏作者

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

抵扣说明:

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

余额充值