数据结构与算法——图

1.图的定义和表示

图的定义

G由集合V和集合E组成,记作G=(V,E),其中:

1、V顶点元素的有限集合;

2、E顶点间关系——的有限集合。

3、边是顶点的无序对有序对

无向图和有向图:

 无向图

没有方向的边构成的图。

无向图中的边由顶点的无序对组成。(用圆括号表示)

邻接点:无向图中,若存在一条边(Vi,Vj),则称Vi和Vj互为邻接点

上图中的边是无方向的,即(V1,V2)(V2,V1)表示同一条边。

有向图

有方向的边构成的图。

:有向图中的边由顶点的有序对组成,也称为弧。(用尖括号表示)

有向图中,顶点的有序对<Vi,Vj>表示从Vi指向Vj的一条有向边,其中Vi是起点,Vj是终点

上图中的边是有方向的,<V1,V2><V2,V1>表示两条不同的边。

图的表示

上图G1中:

V(G1)={1,2,3,4,5,6,7}

E(G1)={(1,2),(1,3),(2,3),(2,4),(2,5),(5,6),(5,7)}

上图G2中:

V(G2)={1,2,3,4,5,6}

E(G2)={<1,2>,<2,1>,<2,3>,<2,4>,<3,5>,<5,6>,<6,3>} 

完全图与子图

完全图:图中任意两项点间均有边直接相连

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

有向完全图:有n个顶点n(n-1)条弧的有向图。

子图:对于图G=(V,E)和图G'=(V',E'),若存在V'∈VE'∈E,则称图G'是图G的子图。

2.图的相关概念

顶点的度

无向图中,顶点的是与每个顶点相连的边数

有向图中,顶点的分成入度出度

入度:以该顶点为终点的弧的数目

出度:以该顶点为起点的弧的数目

路径与回路

路径:从Vi出发,经过一系列的边或弧能够到达Vj,则称Vi到Vj所经过的顶点序列为从Vi到Vj的路径

路径长度:路径经过的边的数目或各边权值之和

回路:起点终点相同的路劲。

简单路径:序列中顶点不重复出现的路径。

简单回路:除了起点和终点,其余顶点不重复出现的回路。

连通图

连通:顶点Vi到Vj有一条路径不要求直达)则Vi和Vj是连通的。

连通图:图中任意两个顶点都是连通的。

连通分量:连通图的每一个极大连通子图。

强连通图:有向图任意不同的顶点Vi和Vj,从Vi到Vj和从Vj到Vi都存在路劲

连通图

强连通图

非连通图的两个连通分量

邻接矩阵

表示顶点间相邻关系的矩阵。

设G=(V,E)是有n(n>0)个顶点的图,G的邻接矩阵A是具有以下性质的n阶方阵

特点:

无向图的邻接矩阵沿对角线对称

有向图的邻接矩阵不一定对称

示例:

无向图的邻接矩阵

有向图的邻接矩阵

权与网

:图中边或弧上附带的数值称为权(w)。

带权的图称为网。

3.图的存储结构与实现 

邻接表

 邻接表:有顶点表边表组成,是链式存储结构。

顶点表

存放图中每个顶点的信息以及指向该顶点边表的头指针。顶点表通常采用顺序存储结构。

顶点表的结点结构:data——head

顶点域data存放顶点信息,head为边表头指针。

边表

为图中的每个顶点建立的单链表,单链表中存放与同一个顶点相邻接的邻接点,相当于邻接矩阵中的一行。

边表的结点结构:adjVex——next

邻接点域adjVex存放邻接点在顶点表中的序号,next为指向下一个邻接点的指针。

示例:无向图的邻接表

逆邻接表

结构与邻接表完全相同,只是边表中每个 结点存放的是每条弧的弧尾顶点。

4.图的遍历方法

深度优先遍历(DFS)

1、从图的某一顶点v出现起点任选),访问此顶点;

2、选择一个与顶点v相邻未被访问过的顶点w,再从w出发进行深度优先遍历(递归),直至图中所有和v连通的顶点都被访问过为止;

3、若此时图中尚有顶点未被访问,则另选图中一个未被访问的顶点作起点,重复上述过程,直至图中所有顶点都被访问为止。

深度优先遍历过程

为图的顶点设置一个访问标记数组visited[n],其中相应顶点的元素值为0表示为访问,为1表示已访问。

该图的深度优先搜索的输出序列为:ABCFEGDHI

示例:深度优先遍历无向图

深度遍历:V1->V2->V4->V8->V5->V6->V3->V7

示例:深度优先遍历有向图

深度遍历:V1->V2->V4->V8->V3->V6->V7->V5

广度优先遍历(BFS)

1、从图的某一项顶点V出发起点任选),访问顶点;

2、访问V的所有未被访问过的邻接点V1,V2,...,Vt按照V1,V2,...,Vt的次序,访问每一个顶点的所有未被访问过的邻接点。依此类推,直至图中所有和V连通的顶点都未被访问过为止;

3、若此时图中尚有顶点未被访问,则另选图中一个未被访问的顶点作为起点,重复上述过程,直至图中所有顶点都被访问为止。

广度优先遍历过程

该图的广度优先搜索的输出序列为:ABEDCGFHI

示例:广度优先遍历无向图

广度遍历:V1->V2->V3->V4->V5->V6->V7->V8

示例:广度优先遍历有向图

广度遍历:V1->V2->V3->V4->V6->V7->V8->V5

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

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

相关文章

HTMLCSS:爱上班的猫咪

这段HTML和CSS代码是一个SVG动画的示例&#xff0c;它描述了一个包含猫咪和笔记本电脑的复杂场景 HTML <div class"content"><div class"container"><svg id"bongo-cat" xmlns"http://www.w3.org/2000/svg" xmlns:x…

CPU Study - Pipeline Basic

参考来源&#xff1a;《超标量处理器设计》—— 姚永斌 超标量处理器 一个程序执行时间的公式如下&#xff0c;而这个公式通常也反映了处理器的性能&#xff1a; 图中的CPI - Cycle Per Instruction也就是CPU每条指令需要的周期数量&#xff0c;CPI计算方法就是周期数量除以…

keep-alive - 2024最新版前端秋招面试短期突击面试题【100道】

keep-alive - 2024最新版前端秋招面试短期突击面试题【100道】 &#x1f5c4;️ <keep-alive> 是 Vue.js 中的一个内置组件&#xff0c;用于在组件切换时缓存组件的状态&#xff0c;避免重复渲染&#xff0c;从而提升应用性能。以下是关于 keep-alive 的详细总结。 1. …

Debezium系列之:Debezium3版本增量快照和只读增量快照应用的变化

Debezium系列之:Debezium3版本增量快照和只读增量快照应用的变化 一、需求背景二、基于数据库信号表使用增量快照案例三、基于Kafka信号Topic使用增量快照案例四、只读增量快照案例五、增量快照技术总结增量快照相关知识请阅读博主下面系列文章: Debezium系列之:实现增量快照…

YOLO即插即用---PConv

Run, Don’t Walk: Chasing Higher FLOPS for Faster Neural Networks 论文地址&#xff1a; 1. 论文解决的问题 2. 解决问题的方法 3. PConv 的适用范围 4. PConv 在目标检测中的应用 5. 评估方法 6. 潜在挑战 7. 未来研究方向 8.即插即用代码 论文地址&#xff1a; …

【JavaScript】V8,Nodejs 与浏览器

V8 V8 是一个 JavaScript engine&#xff0c;负责编译并执行 JavaScript 源代码&#xff0c;处理对象的内存分配&#xff0c;并对不再需要的对象进行垃圾收集。 V8 包含两个主要组件&#xff1a; Memory Heap&#xff1a;负责存储分配。 Call Stack&#xff1a;代码执行时&am…

RoCE与IB对比分析(一):协议栈层级篇

在 AI 算力建设中&#xff0c; RDMA 技术是支持高吞吐、低延迟网络通信的关键。目前&#xff0c;RDMA技术主要通过两种方案实现&#xff1a;Infiniband和RoCE&#xff08;基于RDMA的以太网技术&#xff0c;以下简称为RoCE&#xff09;。 RoCE与IB网络架构概述 RoCE和InfiniBa…

AI - 使用LangChain请求LLM结构化生成内容

AI - 使用LangChain请求LLM结构化生成内容 基于深度学习的大型语言模型&#xff08;LLM&#xff09;不仅可以生成文本&#xff0c;还可以帮助我们完成许多复杂任务&#xff0c;如自动化客服、内容创作和数据分析。然而&#xff0c;如何从这些模型中结构化地获取输出&#xff0c…

lsblk 命令学习

一、命令介绍 lsblk(list block devices) 是一个用于列出块设备的命令&#xff0c;它提供了关于系统中所有块设备的详细信息。块设备包括硬盘、分区、磁盘镜像文件等。lsblk 命令非常有用&#xff0c;特别是在需要查看和管理存储设备时。 $ lsblk NAME MAJ:MIN RM SIZE RO…

Linux基础-常用操作命令详讲

Linux基础-常用操作命令详讲 一、openssl加密简单介绍 1. 生成加密的密码散列&#xff08;password hash&#xff09;​编辑 1.1 常见的选项总结表 1.2 加密参数详解 2. 自签名证书 3. 证书转换 二、文件管理 1. 创建空文件 ​编辑 2. 删除文件 4. 新建目录 ​编辑…

Windows、Linux系统上进行CPU和内存压力测试

CPU和内存压力测试 1. Linux环境 Linux环境下&#xff0c;我们可以用 stress 工具进行内存、CPU等的压力测试。 【1】. stress工具说明 [kalamikysrv1 ~]$ stress --help stress imposes certain types of compute stress on your systemUsage: stress [OPTION [ARG]] ...-…

windows C#-析构元组和其他类型(下)

用户定义类型的扩展方法 如果没有创建类、结构或接口&#xff0c;仍可通过实现一个或多个 Deconstruct 扩展方法来析构该类型的对象&#xff0c;以返回所需值。 以下示例为 System.Reflection.PropertyInfo 类定义了两个 Deconstruct 扩展方法。 第一个方法返回一组值&#x…

Linux 经典面试八股文

快速鉴别十个题 1&#xff0c;你如何描述Linux文件系统的结构&#xff1f; 答案应包括对/, /etc, /var, /home, /bin, /lib, /usr, 和 /tmp等常见目录的功能和用途的描述。 2&#xff0c;在Linux中如何查看和终止正在运行的进程&#xff1f; 期望的答案应涵盖ps, top, htop, …

香港服务器网络延迟的测量指标包括哪些?

网络延迟是影响香港服务器性能和用户体验的关键因素。网络延迟是指数据包从源头传输到目的地所需的时间。延迟的产生可能受到多种因素的影响&#xff0c;包括网络拥塞、传输媒介、路由器处理时间等。理解延迟的不同测量指标是评估和优化网络性能的重要基础。 主要测量指标&…

各种网络设备的工作原理

网络设备的工作原理涉及多种设备&#xff0c;包括路由器、交换机、防火墙等&#xff0c;它们各自承担着不同的功能。以下是对这些设备工作原理的详细解释&#xff1a; 一、路由器路由器是互联网通信中的关键设备&#xff0c;它负责在不同网络之间传输数据包。功能&#xff1a;路…

GEE 使用 JavaScript 中的 API 自动删除文件夹内的所有资产

目录 简介 函数 ee.data.listAssets(parent, params, callback) Arguments: Returns: api.ListAssetsResponse ee.data.deleteAsset(assetId, callback) Arguments: forEach(outputNames) Arguments: Returns: Reducer 代码 简介 使用 JavaScript 中的 API 自动删除…

JVM知识点大全(未完...)

JVM运行时数据区域 堆 堆是Java虚拟机中用于存储对象的主要区域&#xff0c;包括字符串常量池。绝大多数对象都是在堆中创建的&#xff08;少部分对象可能会在栈上分配&#xff09;。为了更好地进行垃圾回收&#xff0c;堆被划分为年轻代和老年代两部分。年轻代又被进一步分为E…

九宫格按键输入

题目描述 九宫格按键输入&#xff0c;有英文和数字两个模式&#xff0c;默认是数字模式&#xff0c;数字模式直接输出数字&#xff0c;英文模式连续按同一个按键会依次出现这个按键上的字母&#xff0c;如果输入""或者其他字符&#xff0c;则循环中断&#xff0c;输…

EPSON机械手与第三方相机的校准功能设计By python

EPSON机械手与第三方相机的校准功能设计By python 使用Python来实现EPSON机械手与第三方相机的校准功能是一个复杂但可行的任务。这通常涉及以下几个步骤:硬件接口通信、图像处理、标定算法实现和控制逻辑编写。 1. 环境准备 首先,库 pip install numpy opencv-python pyse…

ZISUOJ 2024算法基础公选课练习一(1)

前言、 又是一年算法公选课&#xff0c;与去年不同的是今年学了一些纯C&#xff08;而不是带类的C&#xff09; 一、我的C模板 1.1 模板1 #include <bits/stdc.h> using i64 long long;int main() {std::cin.tie(nullptr)->sync_with_stdio(false);return 0; } 1…