【数据结构】06图

  • 1. 定义
    • 1.1 无向图和有向图
    • 1.2 度、入度和出度
    • 1.3 图的若干定义
    • 1.4 几种特殊的图
  • 2. 图的存储
    • 2.1 邻接矩阵-顺序存储(数组)
    • 2.2 邻接表-顺序存储+链式存储(数组+链表)
    • 2.3 十字链表-适用于有向图
    • 2.4 邻接多重表-适用于无向图
  • 3. 图的基本操作
    • EdgeExist(G,v,w)
    • AllAdjVex(G,v)
    • InsertVex(G,v)
    • DeleteVex(G,v)
    • InsertEdge(G,v,w)
  • 4. 图的遍历
    • 4.1 广度优先搜索(BFS)
    • 4.2 深度优先搜索(DFS)

1. 定义

(Graph)是一种比线性表和树更复杂的数据结构。在线性表中,数据元素之间是一对一的关系,每个数据元素只有一个直接前驱和一个直接后继。在树形结构中,数据元素之间有明显的层次关系,上一层的数据元素(结点)和下一层的数据元素(结点)是一对多的关系。而在图形结构中,数据元素之间的关系是任意的,是多对多的关系。
在图中,数据元素通常称作顶点(Vertex),简称V,是有穷非空的集合,记为 V = { v 1 , v 2 , . . . v n } V=\{v_1,v_2,...v_n\} V={v1,v2,...vn},|V|表示顶点个数。两个顶点之间的关系称作(Edge),简称E,是有穷的集合,记为 E = ( u , v ) ∣ u ∈ V , v ∈ V E={(u,v)|u\in{V},v\in{V}} E=(u,v)uV,vV,|E|表示边的条数。
图简称G,由顶点集V和边集E组成,记作G=(V,E)
在这里插入图片描述
第三幅图不是图的数据结构

1.1 无向图和有向图

在这里插入图片描述
图G1中,每条边是没有方向的(无向边),则图G1是无向图。
图中的边是顶点的无序对,例如顶点V1和V2之间的边,记作(V1,V2)或(V2,V1)都可以。
G1=(V1,E1)
V1={V1,V2,V3,V4,V5}
E1={(V1,V2),(V1,V3),(V2,V4),(V3,V5)}
在这里插入图片描述
图G2中,每一条边是有方向的(有向边),则图G2是有向图
图中的边是顶点的有序对,例如顶点V2和V1之间的边只能记作<V2,V1>
G2={V2,E2}
V2={V1,V2,V3,V4,V5}
E2={<V2,V1>,<V1,V3>,<V3,V5>,<V5,V3>}
有向边也称为,<V2,V1>称为顶点V2到顶点V1的弧。V2是弧尾(初始点),V1是弧头(终端点)。顶点V2邻接到顶点V1。
简单图:不存在重复的边,不存在顶点到自身的边

1.2 度、入度和出度

无向图:

  • 顶点的度:与该顶点关联的边的条数。图G1中,TD(V1)=2,TD(V2)=2…
  • 无向图中全部顶点的度的和=边数X2

有向图:

  • 入度:以该顶点为终点的边的条数:ID(V1) = 1,TD(V2)=0
  • 出度:以该顶点为起点的边的条数:OD(V1)=1,OD(V2)=1
  • 度:顶点的度是该顶点的入度和出度之和,TD(V1)=ID(V1)+OD(V1)=2
  • 有向图中全部顶点的入度之和等于出度之和

1.3 图的若干定义

路径:从顶点Vx到Vy的顶点序列
回路:第一个顶点和最有一个顶点相同的路径成为回路或环
简单路径:在路径的序列中,顶点没有重复出现
简单回路:除第一个顶点和最后一个顶点外,其他顶点没有重复出现
路径长度:路径上边的条数
顶点到顶点的距离:顶点之间最短路径的长度,如果不存在路径,记为无穷 ∞ \infin
在无向图中,如果顶点Vx到顶点Vy有路径,表示Vx和Vy是连通的。
在有向图中,如果顶点Vx到顶点Vy和顶点Vy到顶点Vx都有路径,表示Vx和Vy是强连通的。
连通图:任意两个顶点都是连通的。
强连通图:任意两个顶点都是强连通的。
生成子图:生成子图包含了原图的全部顶点和若干条边
连通分量:无向图中,极大的连通子图称之为连通分量(是连通子图 每个连通子图尽可能包含更多的顶点和边)
强连通分量:有向图中,极大的强连通子图称之为强连通分量(是强连通子图 每个强连通子图金肯包含更多的顶点和边)
生成树:无向连通图中,生成树是指包含了全部顶点的极小连通子图(连通图 全部顶点 边最少)
带权图:在一个图中,边可以表示某种含义的数值,例如顶点之间的距离,该数值称为边的权值。如果图的边上带了权值,那么该图称为带权图,或网。带权图中,某条路径上全部边的权值之和,称为该路径的带权路径长度。

1.4 几种特殊的图

  • 完全图
    • 无向完全图:图中任意两个顶点都存在一条边
    • 有向完全图:图中任意两个顶点都存在方向相反的两条边
  • 稀疏图和稠密图:边很少的图称为稀疏图,反之称为稠密图
  • 树:不存在回路的连通无向图
  • 有向树:有且仅有一个结点的入度为0,除树根外的结点入度为1,从树根到任一结点有一条有向通路

2. 图的存储

图的存储方式有四种:邻接矩阵、邻接表、十字链表、邻接多重表

2.1 邻接矩阵-顺序存储(数组)

图的邻接矩阵(Adjacency Matrix)存储方式是用两个数组来表示图。一个一维数组存储顶点信息,一个二维数组(称为邻接矩阵)存储图中的边或弧的信息。
在这里插入图片描述
在这里插入图片描述

  • 对于图:结点之间有连接则边表中对应项记为1,无连接则记为0。但是无向图是A-C和C-A都有,然而有向图则只有C-A没有A-C,需要看清方向。
  • 在无向图的邻接矩阵中,顶点的度为该顶点所在行或列中非零元素的个数。
  • 在有向图的邻接矩阵中,顶点的出度为该顶点所在中的非零元素的个数,入度为该顶点所在中的非零元素个数。顶点的度=出度+入度
    对于A顶点:无向图的度=3,有向图的度=1+2=3
  • 对于带权图,把每条边的权值存入邻接矩阵,如果顶点之间不存在边存入无穷表示
// 利用邻接矩阵存储图
typedef char VertType; // 定义顶点的数据类型
typedef int EdgeType; // 定义边权的数据类型
#define MAXVNUM 100 // 顶点的最大数值
#define INFINITY 65536 // 无穷常量,也可以用边的权值不可能出现的值struct MGraph
{VertType vexs[MAXVNUM]; // 顶点表EdgeType edges[MAXVNUM][MAXVNUM]; // 带权边表,邻接矩阵int vexnum, arcnum; // 顶点数|V|和边数|E|
};

2.2 邻接表-顺序存储+链式存储(数组+链表)

顶点的信息存放在一维数组中,每个顶点的边的信息存放在边链表中。
在这里插入图片描述

// 边链表结构体
struct ENode
{int adjvex; // 邻接点域,存储该顶点对应的下标EdgeType info; // 存储权值ENode* next; // 指针域,指向下一个邻接顶点
};
// 顶点结构体
struct VNode 
{VertType data; // 数据域,存储顶点信息ENode* first; // 边表头指针
};
// 图的结构体
struct AdjListGraph
{VNode vexs[MAXVNUM]; //顶点数组int vexnum,arcnum; // 顶点数和边数
};

2.3 十字链表-适用于有向图

十字链表就是有两个边链表的邻接表。
在这里插入图片描述

2.4 邻接多重表-适用于无向图

1)边链表结点有冗余,无向图中对于A-B之间的边,在A的边链表中有B,在B的边链表中有A,只需要一个就能表达含义了。
2)删除边和顶点操作很麻烦,时间复杂度高。
在这里插入图片描述

3. 图的基本操作

EdgeExist(G,v,w)

判断图G中是否存在从顶点v到顶点w的边,(v,w)或<v,w>,如(G,C,D)。

  • 邻接矩阵:检查C行D列是否为1。
  • 邻接表中:检查C顶点的边链表中是否有顶点D。

AllAdjVex(G,v)

列出图G中与顶点v邻接的边,如(G,C)
对于无向图:

  • 邻接矩阵:检查C整(行)列,输出为1对应的顶点
  • 邻接表:检查顶点C的边链表,输出顶点。

对于有向图:邻接的边包括出边和入边

  • 邻接矩阵:检查C整行,输出为1对应的顶点(出边);检查C整列,输出为1对应的顶点(入边)。
  • 邻接表:访问顶点C对应的边链表,输出顶点(出边);依次访问每个顶点(除C自身)的边链表,如果有C,则输出该顶点(入边)。

InsertVex(G,v)

在图G中插入顶点v,此时不需要插入边,只用插入顶点。

DeleteVex(G,v)

从图G中删除顶点v,如(G,C)。删除顶点C。(真删除和伪删除)
对于无向图:

  • 邻接矩阵:删除顶点表中的C,后续元素前移;邻接矩阵中删除C对应的行列,并移动元素
  • 邻接表:删除顶点表中的C,以及对应的边链表。还要遍历其他顶点,删除边链表中的C

InsertEdge(G,v,w)

在图G中插入一条从顶点v到w的边。如(G,C,D)
无向图

  • 邻接矩阵:C行D列和D行C列都需要置为1
  • 邻接表:顶点C的边链表中插入新结点D;顶点D的边链表中插入新结点C。
    有向图:
  • 邻接矩阵:C行D列置为1
  • 邻接表:顶点C的边链表中插入新结点D

4. 图的遍历

4.1 广度优先搜索(BFS)

图的广度优先搜索类似于树的层次遍历,需要使用一个辅助队列和辅助数组(用于记录已经访问过的数组)来实现
在这里插入图片描述
图的遍历可以从任意一个结点开始,假设从顶点2开始。顶点2入队,并查找visited数组中对应的下标是否已经访问,没有置为true。
在这里插入图片描述
出队队头元素,并将其邻接点未访问顶点入队,包括5,6,3,1
在这里插入图片描述
出队队头元素,并将其邻接点未访问顶点入,5出队后没有入队,6出队后入队7
在这里插入图片描述出队队头元素,并将其邻接点未访问顶点入,3出队后没有元素入队,1出队后入队4
在这里插入图片描述
出队队头元素,并将其邻接点未访问顶点入,7出队后没有元素入队,4出队后入队8,9
在这里插入图片描述
出队队头元素,8,9。队列为空,遍历完成。

4.2 深度优先搜索(DFS)

图的深度优先搜索与图的先序遍历类似。可以利用递归或者栈的形式实现。具体就不在这里展开了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/811896.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设计模式代码实战-建造者模式

1、问题描述 小明家新开了一家自行车工厂&#xff0c;用于使用自行车配件&#xff08;车架 frame 和车轮 tires &#xff09;进行组装定制不同的自行车&#xff0c;包括山地车和公路车。 山地车使用的是Aluminum Frame&#xff08;铝制车架&#xff09;和 Knobby Tires&#x…

【随笔】Git 高级篇 -- 管理多分支 git rebase(二十二)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

vue elementUI form组件动态添加el-form-item rules且支持添加自定义校验方法

vue elementUI form组件动态添加el-form-item rules且支持添加自定义校验方法 组件动态添加el-form-item并且动态添加rules的方法可以参考博客&#xff1a;添加自定义校验方法validatePassFun 组件动态添加el-form-item并且动态添加rules的方法可以参考博客&#xff1a; vue e…

PyTorch环境配置问题

为什么深度学习都是用英伟达的显卡&#xff1f; 首先我们需要了解什么是CUDA&#xff1f; CUDA&#xff08;Compute Unified Device Architecture&#xff09;&#xff0c;是显卡厂商 NVIDIA 推出的运算平台。 CUDA就类似于编程语言&#xff0c;开发者和显卡通过CUDA进行交流…

Android网络抓包--Charles

一、Android抓包方式 对Https降级进行抓包&#xff0c;降级成Http使用抓包工具对Https进行抓包 二、常用的抓包工具 wireshark&#xff1a;侧重于TCP、UDP传输层&#xff0c;HTTP/HTTPS也能抓包&#xff0c;但不能解密HTTPS报文。比较复杂fiddler&#xff1a;支持HTTP/HTTPS…

【SpringBoot】mybatis-plus实现增删改查

mapper继承BaseMapper service 继承ServiceImpl 使用方法新增 save,updateById新增和修改方法返回boolean值,或者使用saveOrUpdate方法有id执行修改操作,没有id 执行新增操作 案例 Service public class UserService extends ServiceImpl<UserMapper,User> {// Au…

用于大规模数据集(大于1TB)的并行运算的MapReduce是怎么实现的?

MapReduce 是一种编程模型&#xff0c;用于处理和生成大数据集。MapReduce 分为两个阶段&#xff1a;Map 阶段和 Reduce 阶段。 Map 阶段&#xff1a;在这个阶段&#xff0c;输入数据被拆分成不同的数据块&#xff0c;这些数据块被分发到各个 Map 任务上。每个 Map 任务对输入的…

Golang | Leetcode Golang题解之第24题两两交换链表中的节点

题目&#xff1a; 题解&#xff1a; func swapPairs(head *ListNode) *ListNode {dummyHead : &ListNode{0, head}temp : dummyHeadfor temp.Next ! nil && temp.Next.Next ! nil {node1 : temp.Nextnode2 : temp.Next.Nexttemp.Next node2node1.Next node2.Nex…

数据结构(算法)

总结&#xff0c;建议看EXCEL的《算法》页签&#xff0c;不然感觉有点乱 备注原理/步骤时间复杂度空间复杂度串的应用模式匹配简单/暴力O(mn) KMP  O(mn) 树的应用树哈夫曼树1、带权路径长度WPL 2、外部排序-最佳归并树1、哈夫曼树的度&#xff0c;只有0和m&#xff08;m叉…

react17+antd4 Menu 点击菜单收起其他展开的所有菜单、页面刷新时设置菜单的选中状态和展开状态

菜单栏展开回收、页面刷新时确保菜单状态与当前页面匹配 1.菜单栏展开和回收事件2. 刷新时默认当前选中项样式的处理2.1 刷新页面菜单保持用户之前的选中状态2.2 配置展开项openKeys的初始值 export const asyncRouterMap [{path: /page1,title: page1,icon: HomeOutlined,}, …

Linux上下载部署zentao v15.5及具体的使用

1.先查询一下Linux的操作系统的位数&#xff0c;确保下载的文件位数与os的一致 [rootlocalhost xiaoming]# uname -m x86_64 [rootlocalhost xiaoming]# getconf LONG_BIT 64 2.下载zentao的Linux压缩包 wget https://www.zentao.net/dl/zentao/15.5/ZenTaoPMS.15.5.zbox…

vue创建一个项目

要创建一个Vue项目&#xff0c;你可以使用Vue CLI&#xff08;命令行界面&#xff09;这个官方工具。以下是使用Vue CLI创建一个新项目的步骤&#xff1a; 步骤 1: 安装 Node.js 和 npm 首先&#xff0c;确保你的计算机上已经安装了Node.js和npm&#xff08;Node.js的包管理器…

【opencv】示例-inpaint.cpp 图像修复是通过填充损坏图像部分从而修复这些损坏的过程...

原始图像 这段代码展示了一个使用OpenCV库进行图像修复的例子。它首先包含了处理图像编码、解码、显示、处理和照片处理所必要的OpenCV模块的头文件。然后利用cv和std命名空间下的类和方法。通过定义一个鼠标回调函数onMouse来处理图像上的绘图操作&#xff0c;并通过主函数mai…

基于大数据的全国热门景点数据可视化分析系统

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 本文将介绍如何使用Python中的Pandas库进行数据挖掘&#xff0c;并结合Flask Web框架实现一个旅游景点数据分析系统。该系统将包括以下功能模块&#xff1a;热门景点概况、景点星级与评分分析、景…

贪心:P2240 【深基12.例1】部分背包问题

目录 【深基12.例1】部分背包问题题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 代码实现 【深基12.例1】部分背包问题 题目描述 阿里巴巴走进了装满宝藏的藏宝洞。藏宝洞里面有 N ( N ≤ 100 ) N(N \le 100) N(N≤100) 堆金币&#xff0c;第 i i i 堆金币的总重…

如何使用 Grafana 监控文件系统状态

当 JuiceFS 文件系统部署完成并投入生产环境&#xff0c;接下来就需要着手解决一个非常重要的问题 —— 如何实时监控它的运行状态&#xff1f;毕竟&#xff0c;它可能正在为关键的业务应用或容器工作负载提供持久化存储支持&#xff0c;任何小小的故障或性能下降都可能造成不利…

已解决java.net.NoRouteToHostException: 无法到达主机异常的正确解决方法,亲测有效!!!

已解决java.net.NoRouteToHostException: 无法到达主机异常的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 目录 问题分析 报错原因 解决思路 解决方法 检查网络连接 核实目标地址 检查防火墙和路由器规则 验证VPN/代理设置 修正网络配置 …

Django 实现登录功能

基本实现 路由 from django.urls import path from . import viewsapp_name index urlpatterns [path(, views.index, nameindex),path("login.html/", views.login, name"login"), ]视图 from django.shortcuts import render, redirect from django…

MR混合现实情景实训教学系统在旅游管理课堂上的应用

旅游管理是一门实践性很强的学科&#xff0c;需要学生掌握理论知识的同时&#xff0c;能够在实际工作中灵活运用。传统的课堂教学方式往往只能通过理论讲解和简单的模拟操作来培养学生的实践能力&#xff0c;而MR混合现实情景实训教学系统则可以为学生提供更加真实、生动的实践…

go第三方库go.uber.org介绍

Uber 是一家美国硅谷的科技公司&#xff0c;也是 Go 语言的早期 adopter。其开源了很多 golang 项目&#xff0c;诸如被 Gopher 圈熟知的 zap、jaeger 等。2018 年年末 Uber 将内部的 Go 风格规范 开源到 GitHub&#xff0c;经过一年的积累和更新&#xff0c;该规范已经初具规模…