【数据结构与算法】第十四章:图的概述、无向图(邻接矩阵、邻接表、深度/广度优先搜索、路径查找)

您所在的位置:网站首页 无向图邻接矩阵和邻接表 【数据结构与算法】第十四章:图的概述、无向图(邻接矩阵、邻接表、深度/广度优先搜索、路径查找)

【数据结构与算法】第十四章:图的概述、无向图(邻接矩阵、邻接表、深度/广度优先搜索、路径查找)

2024-07-04 05:16| 来源: 网络整理| 查看: 265

14.1、图的实际应用

在现实生活中,有许多应用场景会包含很多点以及点点之间的连接,而这些应用场景都可以用即将要学习的图 这种数据结构去解决。

地图

生活中经常使用的地图,基本上是由城市以及连接城市的道路组成,如果把城市看做是一个一个的点,把道路看做是一条一条的连接,那么地图就是将要学习的图这种数据结构

电路图

生活中经常见到的集成电路板,它其实就是由一个一个触点组成,并把触点与触点之间通过线进行连接,这也是即将要学习的图这种数据结构的应用场景

14.2、图的定义及分类

定义

图是由一组顶点和一组能够将两个顶点相连的边组成的

在这里插入图片描述

特殊的图 自环:即一条连接一个顶点和其自身的边平行边:连接同一对顶点的两条边

在这里插入图片描述

图的分类

按照连接两个顶点的边的不同,可以把图分为以下两种:

无向图:边仅仅连接两个顶点,没有其他含义有向图:边不仅连接两个顶点,并且具有方向 14.3、无向图 1)图的相关术语

相邻顶点

当两个顶点通过一条边相连时,称这两个顶点是相邻的,并且称这条边依附于这两个顶点

某个顶点的度就是依附于该顶点的边的个数

子图

是一幅图的所有边的子集(包含这些边依附的顶点)组成的图

路径

是由边顺序连接的一系列的顶点组成

是一条至少含有一条边且终点和起点相同的路径

在这里插入图片描述

连通图

如果图中任意一个顶点都存在一条路径到达另外一个顶点,那么这幅图就称之为连通图

连通子图

一个非连通图由若干连通的部分组成,每一个连通的部分都可以称为该图的连通子图

在这里插入图片描述

2)图的存储结构

要表示一幅图,只需要表示清楚以下两部分内容即可:

图中所有的 顶点所有连接顶点的 边

常见的图的存储结构有两种:邻接矩阵 和 邻接表

1、邻接矩阵 使用一个 V * V 的 二维数组 int [V] [V] adj,把索引的值看做是顶点如果顶点 v 和顶点 w 相连,只需要将 adj [v] [w] 和adj [w] [v] 的 值设置为1,否则设置为0即可

在这里插入图片描述

很明显,邻接矩阵这种存储方式的 空间复杂度是 V^2 的,如果处理的问题规模比较大的话,内存空间极有可能不够用

2、邻接表

使用一个大小为V的数组 Queue[V] adj,把索引看做是顶点

每个索引处 adj[v] 存储了一个 队列,该队列中存储的是所有与该顶点相邻的其他顶点

在这里插入图片描述

很明显,邻接表的空间并不是是线性级别的,所以后面一直采用邻接表这种存储形式来表示图

3)图的实现 1、图的API设计

在这里插入图片描述

2、代码实现 package chapter14; import chapter03.Queue; /** * @author 土味儿 * Date 2021/9/15 * @version 1.0 * 无向图 */ public class Graph { /** * 顶点数量 */ private final int vNum; /** * 边数量 */ private int eNum; /** * 邻接表 */ private Queue[] adj; /** * 构造器 * @param vNum * @param eNum * @param adj */ public Graph(int vNum, int eNum, Queue adj) { // 初始化顶点数量 this.vNum = vNum; // 初始化边数量 this.eNum = 0; // 初始化邻接表 this.adj = new Queue[vNum]; // 初始化邻接表中的空队列 for (int i = 0; i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3