【数据结构】8——图3,十字链表,邻接多重表

数据结构8——图3,十字链表,邻接多重表


文章目录

  • 数据结构8——图3,十字链表,邻接多重表
  • 前言
  • 一、十字链表
    • 结构
      • 例子
    • 复杂例子
  • 二、邻接多重表(Adjacency Multilist)
    • 例子


前言

除了之前的邻接矩阵和邻接表

邻接表不唯一,在有向图中只记录出度

在这里插入图片描述

逆邻接表记录入度


一、十字链表

表示稀疏有向图
结合了邻接表和逆邻接表的思想
获取顶点的出边(从该顶点出发的边)和入边(指向该顶点的边)

  • 通过为每个顶点维护两个链表来实现:一个链表用于存储从该顶点出发的所有边(出边),另一个链表用于存储到达该顶点的所有边(入边)。

结构

十字链表中的每个节点对应图中的一条边

  • 顶点节点:包含顶点信息和两个指针。一个指针指向该顶点的第一个出边节点(如果有的话),另一个指针指向第一个入边节点(通过某个其他顶点指向该顶点的边)的表头节点(这通常是一个哑节点或哨兵节点,用于简化插入和删除操作)。

Data(数据域):存储顶点信息。
First In(第一入边):指向该顶点的第一条入边。
First Out(第一出边):指向该顶点的第一条出边。

  • 边节点:包含边的信息(如权重)、一个指向起始顶点节点的指针、一个指向下一条出边节点的指针(在同一起始顶点下),以及一个指向下一条入边节点的指针(这些入边都指向同一个终点顶点,但它们可能来自不同的起始顶点)。

Tail Vertex(弧尾):表示边的起点。
Head Vertex(弧头):表示边的终点。
Head Link(头链域):指向与当前弧头相同的下一个节点(指向同一个终点的下一条边)。
Tail Link(尾链域):指向与当前弧尾相同的下一个节点(从同一个起点出发的下一条边)。
Info(信息域):存储该边的相关信息,例如权重。

例子

考虑一个简单的有向图,有以下顶点和边:
顶点:A, B, C
边:A -> B, A -> C, B -> C

顶点表:
A:First Out -> A -> B,First In -> None
B:First Out -> B -> C,First In -> A -> B
C:First Out -> None,First In -> A -> C

边节点:
A -> B:
Tail Vertex: A
Head Vertex: B
Tail Link: 指向下一条从 A 出发的边 A -> C
Head Link: 指向下一条指向 B 的边 None
A -> C:
Tail Vertex: A
Head Vertex: C
Tail Link: None
Head Link: 指向下一条指向 C 的边 B -> C
B -> C:
Tail Vertex: B
Head Vertex: C
Tail Link: None
Head Link: None

Vertex A:
  Out: A -> B, A -> C
  In: 
Vertex B:
  Out: B -> C
  In: A -> B
Vertex C:
  Out: 
  In: A -> C, B -> C


复杂例子

顶点:A, B, C, D, E
边:
A -> B
A -> C
A -> D
B -> C
B -> E
C -> D
C -> E
D -> E

上图,按照上面简单例子的思路
先;列顶点,再列边,然后连线

在这里插入图片描述

二、邻接多重表(Adjacency Multilist)

每条边只存储一次,但是它会被链接到两个顶点的链表中,这两个顶点是边的两个端点。

  • 把边的两个顶点存放在边表结点中,所有依附于同一个顶点的边串联在同一链表中。由于每条边依附于两个顶点,则每个边表结点同时链接在两个链表中。

顶点表:存储图中的顶点信息,每个顶点元素包含两个域:
data域:用于存放与顶点相关的信息,如顶点名称或编号。
firstedge域(或类似指针):指向依附于该顶点的第一条边在边表中的节点。

边表:存储图中边的信息,每个边表节点包含多个域,常见的几个域包括:
mark:标志域,用于标记该边是否被访问过或进行过其他特定操作。
ivex和jvex:分别存放该边两个顶点在顶点表中的位置(即下标)。
info:信息域,对于带权图,可以存放边的权值;对于无向图,此域可省略。
ilink和jlink:分别指向下一条依附于顶点ivex和jvex的边在边表中的节点。

例子

考虑一个简单的无向图,包含4个顶点和5条边:
顶点:A, B, C, D
边:
A-B
A-C
B-C
B-D
C-D

  1. 创建顶点节点
    首先,为每个顶点创建一个顶点节点,每个节点包含一个指向其邻接边链表的指针。

顶点节点 A
顶点标识: A
边链表头指针: 指向A的邻接边链表的头节点
.

顶点节点 B
顶点标识: B
边链表头指针: 指向B的邻接边链表的头节点
.
顶点节点 C
顶点标识: C
边链表头指针: 指向C的邻接边链表的头节点
.
顶点节点 D
顶点标识: D
边链表头指针: 指向D的邻接边链表的头节点

  1. 创建边节点
    为每条边创建一个边节点,每个边节点包含以下信息:
    目标顶点: 目标顶点的标识或引用
    边的权重(如果有)
    下一个边节点的指针: 指向链表中的下一个边节点

边节点 A-B
目标顶点: B
边的权重: 无
下一个边节点的指针: null(这是A的链表中的第一个边节点)
.
边节点 A-C
目标顶点: C
边的权重: 无
下一个边节点的指针: null(这是A的链表中的第二个边节点)
.
边节点 B-C
目标顶点: C
边的权重: 无
下一个边节点的指针: null(这是B的链表中的第一个边节点)
.
边节点 B-D
目标顶点: D
边的权重: 无
下一个边节点的指针: null(这是B的链表中的第二个边节点)
.
边节点 C-D
目标顶点: D
边的权重: 无
下一个边节点的指针: null(这是C的链表中的第一个边节点)

3:. 更新邻接表

顶点 A:
将边节点 A-B 插入到A的邻接边链表中。
将边节点 A-C 插入到A的邻接边链表中。
链表顺序为 A-B -> A-C。

顶点 B:
将边节点 B-C 插入到B的邻接边链表中。
将边节点 B-D 插入到B的邻接边链表中。
链表顺序为 B-C -> B-D。

顶点 C:
将边节点 C-D 插入到C的邻接边链表中。
需要将边节点 A-C 插入到C的邻接边链表中。
链表顺序为 C-D -> A-C。

顶点 D:
D的链表为空,因为D没有指向其他节点的边(在无向图中,D的边已经在其他节点的链表中表示)。

  1. 完整的邻接多重表结构

顶点 A
边链表: A-B -> A-C
顶点 B
边链表: B-C -> B-D
顶点 C
边链表: C-D -> A-C
顶点 D
边链表: 空

复杂的,上图,

顶点:A, B, C, D, E, F
边:
A-B
A-C
B-C
B-D
C-E
D-E
D-F
E-F
A-F

在这里插入图片描述
重复的边不再建立节点,而是连接到之前的那个节点上

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在k8s中,客户端访问服务的链路流程,ingress--->service--->deployment--->pod--->container

图片来源:自己画的 ingress是一个API资源。 客户端访问ingress的不同url ingress给客户端返回不同的服务。 就和nginx反向代理服务器一样。 根据不同的url,给客户端返回不同的服务。 -----------------------------------------------------------…

MySql基础-单表操作

1. MYSQL概述 1.1 数据模型 关系型数据库 关系型数据库(RDBMS):建立在关系模型基础上,由多张相互连接的二维表组成的数据库。 特点: 使用表存储数据,格式统一,便于维护 使用SQL语言操作,标准统一&…

班迪录屏和这三款录屏工具,一键操作,太方便了!

嘿,小伙伴们!今天我要跟大家分享几款超棒的录屏工具,它们绝对是我们在工作和学习中不可或缺的好帮;这些工具功能强大且操作简单,下面就让我来详细介绍一下它们的使用体验和好用之处吧! 班迪录屏工具使用体…

医学数据分析实训 项目二 数据预处理作业

文章目录 项目二 数据预处理一、实践目的二、实践平台三、实践内容任务一:合并数据集任务二:独热编码任务三:数据预处理任务四:针对“项目一 医学数据采集”中“3. 通过 UCI 机器学习库下载数据集”任务所下载的数据集进行预处理。…

新能源汽车BMS 学习笔记篇—AFE 菊花链通信中电容隔离 电感隔离的使用

在汽车高压BMS系统中,通常采用 CAN 总线或菊花链((Daisy Chain)架构。菊花链架构通过串行连接每个节点,通常只需要两条信号线穿过所有节点。相比之下,CAN总线通常需要多个并行连接到总线上,布线…

一些写leetcode的笔记

标准库中的string类没有实现像C#和Java中string类的split函数&#xff0c;所以想要分割字符串的时候需要我们自己手动实现。但是有了stringstream类就可以很容易的实现&#xff0c;stringstream默认遇到空格、tab、回车换行会停止字节流输出。 #include <sstream> #incl…

沉浸式体验Stability AI最新超强AI图片生成模型Ultra

2024年9月4日&#xff0c;亚马逊云科技在Amazon Bedrock上新了Stability AI最新的的三款文本图像生成模型&#xff1a;他们分别是Stable Image Ultra、Stable Diffusion 3 Large 和 Stable Image Core。全新的模型在处理多主题提示词、图像质量和图片排版上较上一代模型有显著提…

美团图床设置教程

大厂图床&#xff0c;CDN加速 项目地址&#xff1a;https://github.com/woniu336/mt-img 使用方法 在mt.php填上你的token即可&#xff0c;然后打开index.html上传图片 获取token方法 注册https://czz.meituan.com/发布视频&#xff0c;上传封面&#xff0c;注意在上传封面后…

jenkins流水线+k8s部署springcloud微服务架构项目

文章目录 1.k8s安装2.jenkins安装3.k8s重要知识1.简介2.核心概念3.重要命令1.查看集群消息2.命名空间3.资源创建/更新4.资源查看5.描述某个资源的详细信息6.资源编辑7.资源删除8.资源重启9.查看资源日志10.资源标签 4.k8s控制台1.登录2.界面基本操作1.选择命名空间2.查看命名空…

CCS6 软件及仿真器驱动安装

1 CCS6 软件获取 TI 的官网上下载: http://www.ti.com/tools-software/ccs.html 注意 首先 win32 是 CCS 安装包支持 64 位系统,我们电脑也是 64 位系统也是安装的 win32 的安装包,另外 TI 只提供 win32 的安装包,无 win64 的安装包。 2 CCS6 软件安装 CCS如果获取提供的…

第十二周:机器学习笔记

第十二周周报 摘要Abstract机器学习1. Recurrent Neural Network&#xff08;下&#xff09;1.1 RNN的Loss Function怎么求&#xff1f;1.2 RNN奇怪的特性1.3 如何解决 RNN 梯度消失或者爆炸1.4 RNN 其他应用 Pytorch学习1. 现有的网络模型使用以及其修改1.1 在VGG16模型添加Mo…

docker部署bind9

一、部署 ## docker 部署bind9# docker run -d --name bind9 --restartalways --publish 53:53/tcp --publish 53:53/udp --publish 10000:10000/tcp --volume /data/docker/dns-server:/data --env ROOT_PASSWORDroot dhub.kubesre.xyz/sameersbn/bind:9.16.1-20200524# 建数…

小程序——生命周期

文章目录 运行机制更新机制生命周期介绍应用级别生命周期页面级别生命周期组件生命周期生命周期两个细节补充说明总结 运行机制 用一张图简要概述一下小程序的运行机制 冷启动与热启动&#xff1a; 小程序启动可以分为两种情况&#xff0c;一种是冷启动&#xff0c;一种是热…

53.9k star 提升命令行效率的模糊搜索神器--fzf

fzf简介 作为Linux/Unix命令行的重度用户,你是否还在使用繁琐的管道命令与复杂选项组合来过滤文件和数据?其实我们有一个更简单高效的选择 - fzf。 fzf是一个开源的通用模糊搜索工具,可以大幅度提升命令行的使用体验。它的查询运行速度极快,支持预览选中的文件内容,还能与各…

Tableau学习日记

Day1&#xff1a;Tableau简介、条形图与直方图 1.1 Tableau绘制条形图 1.1.1 条形图1&#xff1a;各地区酒店数量 1.1.2 条形图2&#xff1a;各地区酒店均价 1.1.3 堆积图&#xff1a;价格等级堆积图 1.2 Tableau绘制直方图 1.2.1创建评分直方图 Day2&#xff1a;数据处理、…

CSS“多列布局”(补充)——WEB开发系列35

多列布局是一种非常常见的布局方式&#xff0c;适用于内容丰富的页面&#xff0c;如新闻网站、杂志或博客。 一、CSS多列布局概述 CSS多列布局允许我们将内容分成多个垂直列&#xff0c;使页面布局更加灵活和多样化。多列布局的主要属性包括 ​​column-count​​、​​column…

《OpenCV计算机视觉》—— 图像轮廓检测与绘制

文章目录 一、轮廓的检测二、轮廓的绘制图像轮廓检测与绘制的代码实现 三、轮廓的近似 一、轮廓的检测 轮廓检测是指在包含目标和背景的数字图像中&#xff0c;忽略背景和目标内部的纹理以及噪声干扰的影响&#xff0c;采用一定的技术和方法来实现目标轮廓提取的过程注意:做轮…

GPS/LBS/Wi-Fi定位,全安排!—合宙Air201资产定位模组LuatOS快速入门04

经历了hello world、点灯、远程控制三期基础教程&#xff0c;小伙伴们是不是收获满满&#xff0c;期待更高阶的应用呢&#xff1f; 本期&#xff0c;我们将学习合宙Air201的核心功能之一——定位功能&#xff01; Air201定位示例教程 合宙Air201资产定位模组——是一个集成超…

TCP交互通讯在Windows中的频率

在基于TCP协议的交互式通讯中&#xff0c;通过网口进行数据传输时&#xff0c;Windows系统的通讯频率通常受到多方面的限制&#xff0c;很难稳定达到几千Hz。以下是关于频率范围的合理分析及提高频率的措施。 频率限制的原因&#xff1a; 网络延迟&#xff1a;TCP通讯的一个核心…

SpringBoot集成Thymeleaf模板引擎,为什么使用(详细介绍)

学习本技术第一件事&#xff1a;你为什么要使用&#xff0c;解决什么问题的&#xff1f; 1.为什么使用&#xff08;使用背景&#xff09;&#xff1f; 首先应用场景是单体项目&#xff0c;如果是前后端分离就不用关注这个了&#xff0c;因为单体项目你前后端都是写在一个项目…