数据结构(七)——图

一、图的定义与基本术语

1.图的定义

图G由顶点集V和边集E组成,记为G=(V,E),其中V(G)表示图G中顶点的有限非空集;E(G)表示图G中顶点之间的关系(边)的集合

注意:线性表可以是空表,树可以是空树,图不可以是空图,图可以没有边,但是至少要有一个顶点。

2.图的基本术语

(1)有向图:若E是有向边(简称弧)的有限集合时,则G为有向图。弧是顶点的有序对,记为<vw>,其中v,w是顶点。当v 是弧尾,w 是弧头时,称为从顶点v到顶点w的弧。

(2)无向图:若E是无向边(简称边)的有限集合时,则G为无向图。边是顶点的无序对,记为(v,w)或(w,v),且有(v,w)=(w,v)。其中 v,w 是顶点。

(3)完全图:

1.无向图中任意两点之间都存在边,称为无向完全图 ; 如G1就是无向完全图。无向完全图具有 n(n-1)/2 条边。
2.有向图中任意两点之间都存在方向向反的两条弧,称为有向完全图; 如G4就是有向完全图。有向完全图具有 n(n-1)条弧。

(4)子图:设两个图G=(V,E)和G’=(V',E’),如果V'属于V且 E’属于E,则称G’为G的子图

(5)顶点的度、入度和出度

①顶点的度为以该顶点为一个端点的边的数目

②对于无向图,顶点的边数为度,度数之和是顶点边数的两倍

③对于有向图,入度是以顶点为终点(即箭头所指方向),出度是以顶点为起点(即箭尾巴所指方向)

④有向图的全部顶点入度之和等于出度之和且等于边数。顶点的度等于入度与出度之和。

注意:入度与出度是针对有向图来说的

(6)路径:在图 G=(V,E)中,若从顶点x出发,经过一些顶点v1,...,v2,…,…vm到达顶点y。 则称顶点序列(x,v1, v2,…,vm,y)为从顶点x到顶点y的路径。

(7)路径长度:
非带权图的路径长度是指此路径上边的条数。
带权图的路径长度是指路径上各边的权之和。

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

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

(10)简单回路(环):除第一个和最后一个顶点,其余顶点不重复出现的路径

二、图的存储结构

1.邻接矩阵

图的邻接矩阵的存储方式是用两个数组来表示图。一个一维数组存储图中顶点信息,一个二维数组(称为邻接矩阵)存储图中的边或弧的信息(可分别称他们为顶点数组和边数组)。

无向图中,求某个顶点的度,即计算此顶点v在邻接矩阵中第i行(或第i列)的元素之和。若vi到vj之间有通路,则记为1,反之为0。
有向图中,求某个顶点vi的出度,即求此顶点所在行的元素之和,若求某个顶点的度,即求顶点所在列的元素之和。
设图G有n个顶点,则邻接矩阵是一个n*n的方阵A。

邻接矩阵表示法的优缺点:

优点:                                                                                                                                        (1)便于判断两个顶点之间是否有边,即根据A[i][j]=0或1来判断                                            (2)便于计算各个顶点的度。对于无向图,邻接矩阵第i行元素之和就是顶点i的度;对于有向图,第i行元素之和就是顶点i的出度,第i列元素之和就是顶点i的入度

缺点:
(1)不便于增加和删除顶点
(2)不便于统计边的数目,需要扫描邻接矩阵所有元素才能统计完毕,时间复杂度为 O(n2)
(3)空间复杂度高

2.邻接表

对图中的每个顶点建立一个单链表,存储该顶点所有邻接顶点及其相关信息。每一个单链表设有一个表头结点。把从一个顶点出发的所有边链接在一个单链表(又名边链表)中。把所有边链表的表头结点放在一个顺序表(又名顶点表)中。

邻接表表示法的优缺点:

优点:
(1)便于增加和删除结点
(2)便于统计边的数目
(3)空间效率高


缺点:
(1)不便于判断顶点之间是否有边2.不便于计算有向图各个顶点的度(需要遍历)

三、图的遍历

从图中某一顶点出发访问图中其余结点,使每一个结点被访问且仅被访问依次

图的遍历通常有两种方法:深度优先搜索和广度优先搜索。它们对无向图和有向图都适用

1.深度优先搜索

深度优先搜索思想:假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点,然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和v有路径相通的顶点都被访问到。若此时尚有其他顶点未被访问到,则另选一个未被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。
深度优先搜索是一个递归的过程。首先,选定一个出发点后进行遍历,如果有邻接的未被访问过的节点则继续前进。若不能继续前进,则回退一步再前进,若回退一步仍然不能前进,则连续回退至可以前进的位置为止。重复此过程,直到所有与选定点相通的所有顶点都被遍历。

深度优先遍历类似于二叉树的先序遍历,深度优先遍历通常借助栈来实现算法

深度优先搜索的序列不是唯一的 

代码实现:

void dfs(graph g,vtxptr v0){
//从v0出发深度优先遍历图G
//G是连通图或非连通图中的一个连通分量访问v0;w = v0 的第一个邻接点;while(当邻接点w存在时){if(w未访问)dfs(G,w);//若w未访问,则深度优先遍历图w = 下一邻接点;}
}//dfs

 

2.广度优先搜索

广度优先搜索思想:从图中某顶点v出发,在访问了v之后依次访问v的各个未曾访问过的邻接点,然后分别从这些邻接点出发依次访问它们的邻接点,并使得先被访问的顶点的邻接点先于后被访问的顶点的邻接点被访问,直至图中所有已被访问的顶点的邻接点都被访问到。如果此时图中尚有顶点未被访问,则需要另选一个未曾被访问过的顶点作为新的起始点,重复上述过程,直至图中所有顶点都被访问到为止。

广度优先搜索类似于树的层次遍历,是按照一种由近及远的方式访问图的顶点。在进行广度优先搜索时需要使用队列存储顶点信息。

广度优先遍历通常借助队列来实现算法

代码实现:

void bfs(graph g,vtxptr v0){
//从v0出发广度优先遍历图g(g是连通图或连通分量)visite(v0);mark[v0] = 1;initqueue(Q);enqueue(Q,v0);//v0进队列Qwhile(!queueempty(Q)){delqueue(Q,v);w = 求v第一个的邻接点;while(当邻接点w存在时){if(w未访问){visite(w);mark[w] = 1;enqueue(Q,w);}w = 下一邻接点;}}
}

四、图的应用:拓扑排序

用顶点、边表示活动和彼此相互关系的网络,简称 AOV网络(Activity On Vertices)

顶点:一个工程中的活动(Actifity)

:活动的顶点间的优先关 系(Relation)

要解决的问题是:将各个顶点(代表各个活动)排列成一个线性有序的序列,使得AOV网络中所有应存在的前驱和后继关系都能得到满足

在AOV网络中,如果活动Vi必须在活动Vj之前进行,则存在有向边<Vi,Vj>,AOV网络中不能出现有向回路,即有向环。在AOV网络中如果出现了有向环,则意味着某项活动应以自己作为先决条件。因此,对给定的AOV网络,必须先判断它是否存在有向环

将各个顶点(代表各个活动)排列成一个线性有序的序列,使得AOV网络中所有应存在的前驱和后继关系都能得到满足——拓扑序列。 这种构造AOV网络全部顶点的拓扑有序序列的运算就叫做拓扑排序。即将有向图中的顶点排成一个拓扑序列的过程。

首先建立(n个顶点的)AOV网(1)在AOV网络中选一个没有直接前驱的顶点(入度为0的顶点),并输出之;(2)从图中删去该顶点,同时删去所有它发出的边重复(1)和(2),直到全部顶点均已输出,拓扑有序序列形成,拓扑排序完成;若图中还有未输出的顶点,但已跳出处理循环。这说明图中存在环。

算法思想

(1)建立入度为零的顶点栈;
(2)当入度为零的顶点栈不空时,重复执行                                                                                                (2)-1 从顶点栈中退出一个顶点,并输出;                                                                                              (2)-2 从AOV网络中删去这个顶点和它发出的边,边的终顶点入度减一;
    (2)-3 如果边的终顶点入度减至0,则该顶点进入度为零的顶点栈;                                                (3)如果输出顶点个数少于AOV网络的顶点个数则报告网络中存在有向环。

代码:

五、习题

答案:B

解释:有向图所有顶点入度之和等于所有顶点出度之和。

答案:B

解释:有向图的边有方向之分,即为从n个顶点中重复选取2个顶点有序排列,结果为n(n-1)。

答案:B

解释:所谓连通图一定是无向图,有向图叫强连通图连通n个顶点,至少只需要n-1条边就可以了,由于无向图的每条边同时关联两个顶点,因此邻接矩阵中每条边被存储了两次(也就是说是对称矩阵),因此至少有2(n-1)个非零元素

答案:C

解释:8个顶点的无向图最多有8*712=28条边,再添加一个点即构成非连通无向图,故至少有9个顶点

答案:B

解释:即从该无向图任意一个顶点出发有到各个顶点的路径,所以该无向图是连通图

答案:B

解释:广度优先遍历通常借助队列来实现算法,深度优先遍历通常借助栈来实现算法

答案:D;D

解释:广度:访问V0,依次访问其未访问的邻接顶点(顺着链表)

           深度:首先邻的结点1,然后找到2,然后找到3

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

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

相关文章

Android7 Input(六)InputChannel

概述: 本文讲述Android Input输入框架中 InputChannel的功能。从前面的讲述&#xff0c;我们知道input系统服务最终将输入事件写入了InputChannel&#xff0c;而input属于system_server进程&#xff0c;App属于另外一个进程&#xff0c;当Input系统服务想要把事件传递给App进行…

【 Redis | 实战篇 秒杀实现 】

目录 前言&#xff1a; 1.全局ID生成器 2.秒杀优惠券 2.1.秒杀优惠券的基本实现 2.2.超卖问题 2.3.解决超卖问题的方案 2.4.基于乐观锁来解决超卖问题 3.秒杀一人一单 3.1.秒杀一人一单的基本实现 3.2.单机模式下的线程安全问题 3.3.集群模式下的线程安全问题 前言&…

如何用URDF文件构建机械手模型并与MoveIt集成

机械手URDF文件的编写 我们用urdf文件来描述我们的机械手的外观以及物理性能。这里为了简便&#xff0c;就只用了基本的圆柱、立方体了。追求美观的朋友&#xff0c;还可以用dae文件来描述机械手的外形。 import re def remove_comments(text):pattern r<!--(.*?)-->…

《构建社交应用的安全结界:双框架对接审核API的底层逻辑与实践》

用户生成内容如潮水般涌来。从日常的生活分享&#xff0c;到激烈的观点碰撞&#xff0c;这些内容赋予社交应用活力&#xff0c;也带来管理难题。虚假信息、暴力言论、侵权内容等不良信息&#xff0c;如同潜藏的暗礁&#xff0c;威胁着社交平台的健康生态。内容审核机制&#xf…

39:分类器流程

第一步 创建支持向量机分类器 create_class_svm (7, rbf, KernelParam, Nu, |ClassNames|, one-versus-one, principal_components, 5, SVMHandle) 第二步 添加样本到分类器里 for ClassNumber : 0 to |ClassNames| - 1 by 1 *列出目录下的所有文件 list_files (ReadPath…

LangChain对话链:打造智能多轮对话机器人

LangChain对话链:打造智能多轮对话机器人 目录 LangChain对话链:打造智能多轮对话机器人ConversationChain 是什么核心功能与特点基本用法示例内存机制自定义提示词应用场景与其他链的结合`SequentialChain` 是什么![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/0…

el-select 结合 el-tree:树形下拉数据

一、单选 <template><div class"selectTree-wapper"><el-selectv-model"selectValue"placeholder"请选择"popper-class"custom-el-select-class"ref"selectRef"clearableclear"clearHandle">&…

BFS算法篇——从晨曦到星辰,BFS算法在多源最短路径问题中的诗意航行(下)

文章目录 引言一、01矩阵1.1 题目链接&#xff1a;https://leetcode.cn/problems/01-matrix/description/1.2 题目分析&#xff1a;1.3 思路讲解&#xff1a;1.4 代码实现&#xff1a; 二、飞地的数量2.1 题目链接&#xff1a;https://leetcode.cn/problems/number-of-enclaves…

Leetcode (力扣)做题记录 hot100(49,136,169,20)

力扣第49题&#xff1a;字母异位词分组 49. 字母异位词分组 - 力扣&#xff08;LeetCode&#xff09; 遍历数组&#xff0c;将每一个字符串变成char数组 然后排序&#xff0c;如果map里面有则将他的值返回来&#xff08;key是排序好的字符串&#xff09; class Solution {pu…

【自学30天掌握AI开发】第1天 - 人工智能与大语言模型基础

自学30天掌握AI开发 - 第1天 &#x1f4c6; 日期和主题 日期&#xff1a;第1天 主题&#xff1a;人工智能与大语言模型基础 &#x1f3af; 学习目标 了解人工智能的发展历史和基本概念掌握大语言模型的基本原理和工作机制区分不同类型的AI模型及其特点理解AI在当前社会中的…

WebRTC 源码原生端Demo入门-1

1、概述 我的代码是比较新的&#xff0c;基于webrtc源码仓库的main分支的&#xff0c;在windows下把源码仓库下载好了后&#xff0c;用visual stdio 2022打开进行编译调试src/examples/peerconnection_client测试项目,主要是跑通这个demo来入手和调试&#xff0c;纯看代码很难…

【LeetCode】删除排序数组中的重复项 II

题目 链接 思路 双指针 我好聪明啊&#xff0c;自己想出了这个双指针的办法&#xff0c;哈哈哈哈哈哈哈&#xff0c;太高兴了 代码 class Solution(object):def removeDuplicates(self, nums):""":type nums: List[int]:rtype: int"""nlen…

通义千问席卷日本!开源界“卷王”阿里通义千问成为日本AI发展新基石

据日本经济新闻&#xff08;NIKKEI&#xff09;报道&#xff0c;通义千问已成为日本AI开发的新基础&#xff0c;其影响力正逐步扩大&#xff0c;深刻改变着日本AI产业的格局。 同时&#xff0c;日本经济新闻将通义千问Qwen2.5-Max列为全球AI模型综合评测第六名&#xff0c;不仅…

第J7周:对于ResNeXt-50算法的思考

目录 思考 一、代码功能分析 1. 构建 shortcut 分支&#xff08;残差连接的旁路&#xff09; 2. 主路径的第一层卷积&#xff08;11&#xff09; 4. 主路径的第三层卷积&#xff08;11&#xff09; 5. 残差连接 激活函数 二、问题分析总结&#xff1a;残差结构中通道数不一致的…

如何解决Jmeter中的乱码问题?

在 JMeter 中遇到乱码问题通常是由于字符编码不一致导致的&#xff0c;常见于 HTTP 请求响应、参数化文件读取、报告生成等场景。以下是系统化的解决方案&#xff1a; 1. HTTP 请求响应乱码 原因&#xff1a; 服务器返回的字符编码&#xff08;如UTF-8、GBK&#xff09;与 J…

# YOLOv2:目标检测的升级之作

YOLOv2&#xff1a;目标检测的升级之作 在目标检测领域&#xff0c;YOLO&#xff08;You Only Look Once&#xff09;系列算法以其高效的速度和创新的检测方式受到了广泛关注。今天&#xff0c;我们就来深入探讨一下 YOLOv2&#xff0c;看看它是如何在继承 YOLOv1 的基础上进行…

小白入!WiFi 技术大解析

WiFi&#xff0c;全称Wireless Fidelity&#xff0c;是一种无线局域网技术&#xff0c;允许电子设备通过无线电波连接到互联网。以下是对WiFi的一些介绍&#xff1a; 一、基本概述 定义&#xff1a;WiFi是一种基于IEEE 802.11标准系列的无线局域网技术&#xff0c;使设备能够…

【prometheus+Grafana篇】基于Prometheus+Grafana实现windows操作系统的监控与可视化

&#x1f4ab;《博主主页》&#xff1a; &#x1f50e; CSDN主页 &#x1f50e; IF Club社区主页 &#x1f525;《擅长领域》&#xff1a;擅长阿里云AnalyticDB for MySQL(分布式数据仓库)、Oracle、MySQL、Linux、prometheus监控&#xff1b;并对SQLserver、NoSQL(MongoDB)有了…

推荐一个感觉非常好的文章,是知识图谱的

为了省浏览的事儿&#xff0c;以后打算写文章都短一些&#xff0c;这样不用被强制登录、关注了 正文 链接是 https://blog.csdn.net/Appleyk/article/details/80422055 放个截图 推荐理由 两个&#xff0c;第一内容确实硬核。第二算是缘分吧&#xff0c;我之前公司好像&am…

《企业级前端部署方案:Jenkins+MinIO+SSH+Gitee+Jenkinsfile自动化实践》

文章目录 前言前端项目CICD时序图一、环境准备1、服务器相关2、Jenkins凭据3、注意事项 二、设计思想1. 模块化设计2.多环境支持3. 制品管理4. 安全部署机制5. 回滚机制 三、CI阶段1、构建节点选择2、代码拉取3、代码编译4、打包并上传至minio 四、CD阶段五、回滚阶段六、构建通…