数据结构—图的存储结构

news2024/12/24 2:22:30

6.图

回顾:数据的逻辑结构

集合——数据元素间除 “同属于一个集合” 外,无其他关系。

线性结构——一个对一个,如线性表、栈、队列

树形结构——一个对多个,如树

图形结构——多个对多个,如图

《数据结构C语言版》——绪论_计蒙不吃鱼的博客-CSDN博客_数据结构是带有结构的各数据项的集合

6.1图的定义和术语

: G=(V,E)
    V:顶点(数据元素)的有穷非空集合; 
    E:边的有穷集合。

无向图:每条边都是方向的;

有向图:每条边都是方向的。

networkx画有向图和无向图_静静_jingjing的博客-CSDN博客_networkx画有向图

完全图:任意两个点都有一条边相连。

无向完全图:n 个顶点,n(n-1)/2条边

有向完全图:n 个顶点,n(n-1)条边

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NdIzTjfy-1691238142116)(https://ts1.cn.mm.bing.net/th/id/R-C.bf9aad94a55a06758f0d0d4a2aa083bf?rik=VscqICD0R7hR%2fA&riu=http%3a%2f%2fdata.biancheng.net%2fuploads%2fallimg%2f190103%2f2-1Z103210110O8.gif&ehk=Oi7hLl6AEIQ%2f1UfWj%2fAO6riRvAKN51BTFvzwxhq%2bGSE%3d&risl=&pid=ImgRaw&r=0)]

稀疏图:有很少边或弧的图(e<nlogn)。

稠密图:有较多边或弧的图。

:边/弧带权的图。

邻接:有边/弧相连的两个顶点之间的关系。

​ 存在(vi,vj),则称vi和vj互为邻接点;

​ 存在 <vi,vj>,则称vi邻接到vj,vj邻接到vi

关联(依附):边/弧与顶点之间的关系。

​ 存在(vi,vj)/ <vi,vj>,则称该边/弧关联于vi和vj

顶点的度:与该顶点相关联的边的数目,记为TD(v)

​ 在有向图中,顶点的度等于该顶点的入度与出度之和。

​ 顶点v的入度是以v为顶点的有向边的条数,记作ID(v)

​ 顶点v的出度是以v为始点的有向边的条数,记作OD(v)

查看源图像

问:当有向图中仅1个顶点的入度为0,其余顶点的入度均为1,此时是何形状?

答:是树!而且是一棵有向树!

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rztk0NIk-1691238142118)(https://ts1.cn.mm.bing.net/th/id/R-C.4f3bd2363f037cff739f8e388db9b321?rik=W0cQmZrsrYAcEA&riu=http%3a%2f%2fivr-ahnu.cn%2flectures%2fos%2fimages%2f24.jpg&ehk=rL%2blBOSUE1GCU30Sl09HWmQqTnbVhZDKEDVVUvJxi1U%3d&risl=&pid=ImgRaw&r=0)]

路径:接续的边构成的顶点序列。

路径长度:路径上边或弧的数目/权值之和。

回路(环):第一个顶点和最后一个顶点相同的路径。

简单路径:除路径起点和终点可以相同外,其余顶点均不相同的路径。

简单回路(简单环):除路径起点和终点相同外,其余顶点均不相同的路径。

Graph(1)--图的基本概念_Nicholem的博客-CSDN博客_graph的定义

连通图(强连通图)

​ 在无(有)向图G=(V,{E})中,若对任何两个顶点v、u都存在从v到u的路径,则称G是连通图(强连通图)。

数据结构——图_若尘的博客-CSDN博客_narcnum

权与网

​ 图中边或弧所具有的相关数称为权。表明从一个顶点到另一个顶点的距离或耗费。

​ 带权的图称为网。

子图

​ 设有两个图G=(V,{E})、G1=(V1,{E1}),若V1⊆V,E1⊆E,则称G1是G的子图。

​ 例:(b),(c)是(a)的子图

img

连通分量(强连通分量)

  • 无向图G的极大连通子图称为G的连通分量

    极大连通子图意思是:该子图是G连通子图,将G的任何不在该子图中的顶点加入,子图不再连通。

    img

  • 有向图G的极大强连通子图称为G的强连通分量

    极大强连通子图意思是:该子图是G的强连通子图,将D的任何不在该子图中的顶点加入,子图不再是强连通的。

    img

  • 极小连通子图:该子图是G的连通子图,在该子图中删除任何一条边,子图不再连通。

  • 生成树:包含无向图G所有顶点的极小连通子图。

  • 生成森林:对非连通图,由各个连通分量的生成树的集合。

    img

6.2图的存储结构

图的逻辑结构:多对多

图没有顺序存储结构,但可以借助二维数组来表示元素间的关系。

6.2.1邻接矩阵

1、数组(邻接矩阵)表示法
  • 建立一个顶点表(记录各个顶点信息)和一个邻接矩阵(表示各个顶点之间关系)。
    • 设图A=(V,E)有 n 个顶点。
    • 图的邻接矩阵是一个二维数组。
无向图的邻接矩阵表示法

存在关系记为1,没有关系记为0

算法学习——图之无权图_Talk is cheap, show me the code!-CSDN博客_无权图

分析1:无向图的邻接矩阵是对称的。

分析2:顶点 i 的度 = 第 i 行(列)中1的个数。

特别:完全图的邻接矩阵中,对角元素为0,其余为1。

有向图的邻接矩阵表示方法

算法学习——图之无权图_Talk is cheap, show me the code!-CSDN博客_无权图

注:在有向图的邻接矩阵中,

​ 第 i 行含义:以结点vi为尾的弧(即出度边);

​ 第 i 列含义:以结点vi为头的弧(即入度边)。

分析1:有向图的邻接矩阵可能是不对称的。

分析2:顶点的出度 = 第i行元素之和

​ 顶点的入度 = 第i列元素之和

​ 顶点的度 = 第i行元素之和 + 第i列元素之和

网(即有权图)的邻接矩阵表示法

邻接矩阵_diviner_s的博客-CSDN博客

邻接矩阵存储表示,用两个数组分别存储顶点表邻接矩阵

#define MaxInt 32767
#define MVNum 100  //最大顶点数
typedef char VerTexType;//设顶点的数据类型为字符型
typedef int ArcType;//假设边的权值类型为整型
typedef struct{
  VerTexType vexs[MVNum];//顶点表
  ArcType arcs[MVNum][MVNum];//邻接矩阵
  int vexnum,arcnum;
}AMGraph;
2、采用邻接矩阵表示法创建无向网

算法思想

  1. 输入总顶点数和总边数。
  2. 依次输入点的信息存入顶点表中。
  3. 初始化邻接矩阵,使每个权值初始化为最大值。
  4. 构造邻接矩阵。
Status CreateUDN(AMGraph &G){
  cin>>G.vexnum>>G.arcnum;//输入总顶点数,总边数
  for(i=0;i<G.vexnum;++i)
    cin>>G.vexs[i];//依次输入点的信息
  for(i=0;i<G,vexnum;++i)
    for(j=0;j<G.vexnum;++j)
      G.arcs[i][j]=MaxInt;//边的权值均设置为极大值
  for(k=0;k<G.arcnum;++k){
    cin>>v1>>v2>>w;//输入一条边所依附的顶点及边的权值
    i=LocateVex(G,v1);
    j=LocateVex(G,v2);//确定v1和v2在G中的位置
    G.arcs[i][j]=w;//边<v1,v2>的权值置为w
    G.arcs[j][i]=G.arcs[i][j];//置<v1,v2>的对称边<v2,v1>的权值为w
  }
  return OK;
}

补充算法:在图中查找顶点

int LocateVex(AMGraph G,VertexType u){
  int i;
  for(i=0;i<G.vexnum;++i)
    if(u==G.vexs[i]) return i;
  return -1;
}
3、邻接矩阵的优缺点

邻接矩阵_diviner_ss的博客-CSDN博客_邻接矩阵

邻接矩阵有什么优点?

  • 直观、简单、好理解
  • 方便检查任意一对顶点间是否存在边
  • 方便找任一顶点的所有“邻接点”(有边直接相连的顶点)
  • 方便计算任一顶点的“度”(从该店发出的边数为“出度”,指向该点的边数为“入度”)
    • 无向图:对应行(或列)非0元素的个数
    • 有向图:对应行非0元素的个数是“出度”;对应列非0元素的个数是“入度”。

邻接矩阵的缺点?

  • 不便于增加和删除顶点

  • 浪费空间——存稀疏图(点很多而边很少)有大量无效元素

    ​ ——对稠密图(特别是完全图)还是很合算的

  • 浪费时间——统计稀疏图中一共有多少条边。

6.2.2邻接表

1、邻接表表示法(链式)

img

  • 顶点:按编号顺序将顶点数据存储在一维数组中;
  • 关联同一顶点的边(以顶点为尾的弧):用线性链表存储
无向图邻接表

特点:

  • 邻接表不唯一

  • 若无向图中有n个顶点,e条边,则其邻接表需n个头结点和2e个表结点。适宜存储稀疏图。

  • 无向图中顶点的度为第i个单链表中的结点数。

img

有向图邻接表

特点:找出度易,找入度难

  • 顶点的出度就是第i个单链表中的结点个数。
  • 顶点的入度为整个单链表中邻接点域值是i-1的结点个数。

数据结构——图的邻接表实现_舟浔川的博客-CSDN博客_数据结构有向图的邻接链表

图的邻接表存储表示

顶点的结点结构

typedef struct VNode{
  VerTexType data;//顶点信息
  ArcNode *firstarc;//指向第一条依附该顶点的边的指针
}VNode,AdjList[MVNum];//AdjList表示邻接表类型

说明:例如,AdjList v; 相当于:VNode v[MVNum];

弧(边)的结点结构

#define MVNum 100
typedef struct ArcNode{//边结点
  int adjvex;//该边所指向的顶点的位置
  struct ArcNode *nextarc;//指向下一条边的指针
  OtherInfo info;//和边相关的信息
}ArcNode;

图的结构定义

typedef struct{
  AdjList vertices;
  int vexnum,arcnum;//图的当前顶点数和弧数
}ALGraph;
2、采用邻接表创建无向网

算法思想

  1. 输入总顶点数和总边数

  2. 建立顶点表

    依次输入点的信息存入顶点表中

    使每个表头结点的指针域初始化为NULL

  3. 创建邻接表

    依次输入每条边依附的两个顶点

    确定两个顶点的序号i和j,建立边结点

    将此边结点分别插入到vi和vj对应的两个边链表的头部

Status CreateUDG(ALGraph &G){
  cin>>G.vexnum>>G.arcnum;//输入总顶点数,总边数
  for(i=0;i<G.vexnum;++i){//输入各点,构造表头结点表
    cin>>G.vertices[i].data;//输入顶点值
    G.vertices[i].firstarc=NULL;//初始化表头结点的指针域
  }
  for(k=0;k<G.arcnum;++k){//输入各边,构造邻接表
    cin>>v1>>v2;//输入一条边依附的两个顶点
    i=LocateVex(G,v1);
    j=LocateVex(G.v2);
    p1=new ArcNode;//生成一个新的边结点*p1
    p1->adjvex=j;//邻接点序号为j
    pi->nextarc=G.vertices[i].firstarc;
    G.vertices[i].firstarc=p1;//将新结点*p1插入顶点vi的边表头部
    p2=new ArcNode;//生成另一个对称的新的边结点
    p2->adjvex=i;
    p2->nextarc=G.vertices[j].firstarc;
    G.vertices[j].firstarc=p2;//将新结点*p2插入顶点vj的边表头部
  }
  return OK;
}
3、邻接表特点
  • 方便找任一顶点的所有“邻接点”

  • 节约稀疏图的空间

    • 需要N个头指针 + 2E个结点(每个结点至少2个域)
  • 方便计算任一顶点的“度”

    • 对无向图:是的
    • 对有向图:只能计算“出度”;需要构造“逆邻接表”(纯指向自己的边)来方便计算“入度”
  • 不方便检查任意一对顶点间是否存在边

6.2.3邻接矩阵与邻接表的关系

图的存储与实现_贪婪的君子-CSDN博客

联系:邻接表中每个链表对应与邻接矩阵中的一行,链表中结点个数等于一行中非零元素的个数。

区别

  1. 对于任一确定的无向图,邻接矩阵是唯一的(行列号与顶点编号一致),当邻接表不唯一(链接次序与顶点编号无关)。
  2. 邻接矩阵的空间复杂度为O(n2),而邻接表的空间复杂度为O(n+e)。

用途:邻接矩阵多用于稠密图;而邻接表多用于稀疏图。

6.2.4十字链表

​ 十字链表是有向图的另一种链式存储结构。我们也可以把她看成是将有向图的邻接表和逆邻接表结合起来形成的一种链表。

​ 有向图中的每一条弧对应十字链表中的一个弧结点,同时有向图中的每个顶点在十字链表中对应有一个结点,叫做顶点结点。

img

img

6.2.5邻接多重表

邻接表优点:容易求得顶点和边的信息。

​ 缺点:某些操作不方便(如:删除一条边需找表示此边的两个结点)。

邻接表中,任何一条边,都会出现两次

img

img

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

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

相关文章

安捷伦Agilent37719A通讯分析仪

安捷伦Agilent37719A通讯分析仪(131----4587---6435&#xff09; ATM和POS测试能力达到2.5 Gb/s OC-48、OC-48c、OC-12、OC-12c、OC-3c、OC-3、OC-1、STS-3、STS-3c、STS-1测试 保护切换时间测量 所有同步速率高达2.5 Gb/s的串联有效负载 SONET环翻转的全面直通模式操作 全开销…

九耶|阁瑞钛伦特 Java中,锁的实现方式

在Java中&#xff0c;锁的实现方式有以下几种&#xff1a; 1. Synchronized关键字&#xff1a;使用synchronized关键字可以创建一个互斥锁&#xff0c;它可以保证同一时刻只有一个线程可以进入被synchronized关键字修饰的代码块或方法。 2. ReentrantLock类&#xff1a;Reentr…

谈谈量子计算技术

目录 1.什么是量子计算 2.量子计算的应用领域 3.量子计算对现代科学的影响 4.量子计算未来的发展趋势 1.什么是量子计算 量子计算是一种基于量子力学原理的计算方法&#xff0c;利用量子比特&#xff08;Quantum Bit&#xff0c;简称qubit&#xff09;而不是经典计算中的比特…

Babylon.js开发工具链大全

本文介绍Babylon 团队&#xff08;JS 和原生&#xff09;和社区共同创建的所有出色工具的摘要&#xff0c;以帮助开发人员和设计人员创建出色的 3D 体验。 推荐&#xff1a;用 NSDT设计器 快速搭建可编程3D场景。 1、Sandbox 第一个工具Sandbox可能是最简单的&#xff0c;它实…

Android开源 Skeleton 骨架屏

目录 一、简介 二、效果图 三、引用 Skeleton 添加jitpack 仓库 添加依赖: 四、使用 Skeleton 1、VIew 骨架屏使用 ViewSkeletonScreen 2、列表类View 骨架屏 RecyclerViewSkeletonScreen、GridViewSkeletonScreen、 ListViewSkeletonScreen 一、简介 骨架屏的作用是…

【Linux命令详解 | ls命令】Linux系统中用于列出目录内容的命令

文章标题 简介一&#xff0c;参数列表二&#xff0c;使用介绍1. 基本使用2. 列出文件详细信息3. 列出所有文件4. 以易读的方式显示文件大小5. 只查看目录信息6. 递归列出所有子目录下的文件7. 按文件最后修改时间排序8. 反向排序9. 按文件大小排序10. 显示文件的inode号11. 在文…

STL空间配置器入门

STL简介   STL&#xff08;Standard Template Library&#xff0c;标准模板库&#xff09;&#xff0c;从根本上说&#xff0c;STL是一些“容器”的集合&#xff0c;这些“容器”有list,vector,set,map等&#xff0c;STL也是算法和其他一些组件的集合。 谈及组件&#xff0c…

【雕爷学编程】Arduino动手做(186)---WeMos ESP32开发板5

37款传感器与模块的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&#x…

队伍发展有一定的规律 队伍不好带

队伍发展有一定的规律&#xff0c;队伍不好带 塔克曼是研究组织行为学的 1977年提出了团队发展模型 有一定的借鉴意义 趣讲大白话&#xff1a;社会变了&#xff0c;带队伍不好带了 【趣讲信息科技247期】 **************************** 塔克曼团队发展的五个阶段是&#xff1a;…

数据结构——双链表

我宁愿靠自己的力量&#xff0c;打开我的前途&#xff0c;而不愿求有力者垂青 文章目录 双线向链表各接口函数名或变量名 双向链表接口实现源码 快速索引【头文件及函数声明】 双向链表接口实现 双向链表的构造分析 双向链表的定义及初始化 双向链表的插入和删除 往期…

网络安全设备及部署

什么是等保定级&#xff1f; 之前了解了下等保定级&#xff0c;接下里做更加深入的探讨 文章目录 一、网路安全大事件1.1 震网病毒1.2 海康威视弱口令1.3 物联网Mirai病毒1.4 专网 黑天安 事件1.5 乌克兰停电1.6 委内瑞拉电网1.7 棱镜门事件1.8 熊猫烧香 二、法律法规解读三、安…

SSM(Vue3+ElementPlus+Axios+SSM前后端分离)--具体功能实现【三】

文章目录 SSM--功能实现实现功能04-添加家居信息需求分析/图解思路分析代码实现注意事项和细节 实现功能05-显示家居信息需求分析/图解思路分析 代码实现 SSM–功能实现 实现功能04-添加家居信息 需求分析/图解 思路分析 完成后台代码从dao -> serivce -> controller ,…

C++学习笔记总结练习:迭代器

迭代器 1 基础 头文件 #include<iterator>迭代器范围 begin和end被容器使用了&#xff0c;可以用front和back作为游标。 左闭右开区间 [begin,end)使用迭代器进行遍历 遍历方法有三种&#xff1a;下标遍历、范围for遍历、迭代器遍历 container c; first c.begin(); l…

【项目 计网2】4.4网络模型 4.5协议 4.6网络通信的过程

文章目录 4.4网络模型OSI七层参考模型TCP/IP四层模型&#xff08;常用&#xff09;简介四层介绍 4.5协议简介常见协议UDP协议TCP协议IP协议以太网帧协议&#xff08;MAC地址封装&#xff09;ARP协议&#xff08;IP->MAC&#xff09; 4.6网络通信的过程封装分用 4.4网络模型 …

【Spring】使用注解存储Bean对象

目录 一、配置扫描路径&#xff08;使用注解的方式存对象的前提&#xff09; 二、使用类注解存储Bean对象 1、使用五大类注解存储Bean对象 2、为什么要这么多的类注解&#xff1f; 2.1、五大类注解之间的关系 3、获取Bean对象时的默认命名规则 三、使用方法注解来存储…

【Paper】2020_网络化多智能体系统的事件触发一致性研究_徐勇

徐勇. 网络化多智能体系统的事件触发一致性研究[D].浙江大学,2020.DOI:10.27461/d.cnki.gzjdx.2020.001385. 文章目录 5 已知 DoS 攻击策略下多智能体系统的事件触发安全一致性分析5.1 引言5.2 数学模型与问题描述5.3 控制器和事件触发条件的设计5.5 数值仿真程序 Main.m程序 M…

.locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复

引言&#xff1a; 当今社会&#xff0c;互联网的迅速发展为我们的工作和生活带来了便利&#xff0c;但同时也伴随着越来越多的网络威胁。勒索病毒如.locked勒索病毒便是其中的代表之一。.locked勒索病毒利用高级加密算法&#xff0c;将用户重要的数据文件锁定&#xff0c;要求…

IP路由基础+OSPF 基础

IP路由 RIB与FIB RIB&#xff1a;Routing Information Base&#xff0c;路由信息库 &#xff0c;路由器的控制平面 FIB&#xff1a;Forwarding Information Base&#xff0c;转发信息库&#xff0c;路由器的数据平面 路由信息库主要是记录直连路由以及协议宣告的路由信息&am…

Windows安装子系统Linux

Windows安装子系统(Linux ubuntu&#xff09; 安装条件步骤1.安装WSL命令2.设置Linux用户名和密码3.写个简单的.c程序看看4.如何互传文件 安装条件 Windows 10版本2004及更高的版本才能安装。 步骤 1.安装WSL命令 我们可以使用WSL来安装子系统 Linux ubuntu(默认是这个)。 …

思科2021笔试题

笔试时间&#xff1a;2020.09.07&#xff0c;19&#xff1a;00——21&#xff1a;00 岗位&#xff1a;嵌入式软件工程师 题型&#xff1a;数据结构4道&#xff0c;网络3道&#xff0c;操作系统3道&#xff0c;C4道&#xff0c;Java4道&#xff0c;python4道&#xff0c;数据库…