算法详解——图的深度优先遍历和广度优先遍历

大话数据结构-图的深度优先遍历和广度优先遍历 数据结构中图的深度优先遍历、广度优先遍历定义,邻接矩阵、邻接表、逆邻接表、十字链表、邻接多重表和边集数组的深度优先遍历实现和广度优先遍历实现。 阅读详情
AI摘要

本文详细介绍了图的两种基本遍历方法——深度优先遍历和广度优先遍历,包括遍历过程、核心思想以及C和Python代码实现。通过邻接矩阵展示了如何在无向图中存储和操作边,为理解这两种算法提供了实例。

一、图结构

  图结构指的是如下图所示的由节点和边组成的数据。

在这里插入图片描述

二、深度优先遍历

2.1 图的遍历

  图的遍历任务指的是从图中某个节点开始,遍历得到图中所有节点的过程。

2.2 深度优先遍历过程

  假设我们从1号节点开始进行深度优先遍历。遍历的步骤如下:首先,我们选择1号顶点作为起始点。从1号顶点开始,我们尝试沿着边访问尚未到达过的顶点。我们发现2号顶点是未到达过的,所以我们移动到2号顶点。现在,以2号顶点为起点,我们继续尝试访问其他未到达过的顶点。这样,我们又到达了4号顶点。接着,以4号顶点为起点,我们尝试访问其他未到达过的顶点。然而,此时我们无法再通过4号顶点的边访问其他未到达过的顶点,所以我们需要回到2号顶点。回到2号顶点后,我们发现沿着2号顶点的边也无法再访问其他未到达过的顶点。因此,我们需要继续回到1号顶点。现在,我们继续检查1号顶点的边,看看是否还有其他未到达过的顶点。这时我们到达了3号顶点,然后以3号顶点为起点继续访问其他未到达过的顶点,最后到达了5号顶点。此时,所有顶点都已经被访问过,遍历结束。遍历的顺序如下图所示:

在这里插入图片描述

2.3 深度优先遍历核心思想

  深度优先遍历的核心思想在于:首先选择一个未被访问过的顶点作为起始点,然后沿着当前顶点的边前进到未被访问过的顶点。当当前顶点没有未访问过的邻居顶点时,则回溯到上一个顶点,继续试探访问其他顶点,直到所有的顶点都被访问过为止。显然,深度优先遍历是沿着图的某一条分支遍历直到末端,然后回溯,再沿着另一条分支进行同样的遍历,直到所有的顶点都被访问过为止。

2.4 深度优先遍历实现

  如何将这一过程用代码实现呢?在讨论代码实现之前,我们需要先解决如何存储一个图的问题。最常用的方法是使用一个二维数组 e e e 来表示,具体如下所示:

在这里插入图片描述

  上图中的二维数组中,第 i i i行第 j j j列表示从顶点 i i i到顶点 j j j是否存在一条边。其中, 1 1 1表示存在边, ∞ ∞ ∞表示不存在边。我们将自己到自己的路径(即 i i i等于 j j j)设为 0 0 0。这种图的存储方式被称为邻接矩阵存储法。

  注意观察的同学会发现,这个二维数组沿主对角线对称。这是因为上述图是无向图。无向图指的是图的边没有方向性,例如边1-5表示,1号顶点可以到达5号顶点,同时5号顶点也可以到达1号顶点。

  接下来,我们将解决如何使用深度优先搜索来实现图的遍历。

// C 代码

#include <stdio.h>

int book[101], sum, n, e[101][101];

void dfs(int cur) // cur 是当前所在的顶点编号
{
   
   
    int i;
    printf("%d ", cur);
    sum++; // 每访问一个顶点,sum就加1
    if (sum == n)
        return; // 所有的顶点都已经访问过则直接退出
    for (i = 1; i <= n; i++) // 从1号顶点到n号顶点依次尝试,看哪些顶点与当前顶点cur有边相连
    {
   
   
        // 判断当前顶点cur到顶点i是否有边,并判断顶点i是否已访问过
        if (e[cur][i] == 1 && book[i] == 0)
        {
   
   
            book[i] = 1; // 标记顶点i已经访问过
            dfs(i);      // 从顶点i再出发继续遍历
        }
    }
    return;
}

int main()
【数据结构与算法】图的遍历(深度优先遍历DFS算法) 1.1深度优先遍历 深度优先遍历(depth first search),也有称为深度优先搜索简称DFS。它的主要思想就是例如找钥匙一样。例如:我们的一把车钥匙被搞丢了但是可以确定的是它一定就在家里的某个位置,所以我们需要从房间开始寻找,可是我们是该在房间某一处寻找还是将一整个房间搜索完之后再找其他房间的地方呢?在深度优先遍历意思就是将一个房间的所有地方搜索完之后再进行其他房间的搜索,直至找到车钥匙为止。 假设你现在需要完成一个任务,要知道你在如下迷宫中,从顶点A开始要走遍所有图中的顶点并作上标记,注. 阅读详情

相关推荐

【算法】深度优先遍历(DFS)算法详解与实现

深度优先遍历是一种重要的遍历算法,对于理解树和图的结构及其应用具有重要意义。通过掌握深度优先遍历的原理和常见实现方式,能够更加深入地理解算法的本质,并能够应用于解决各种相关问题。

Colorful___的博客 3882

【数据结构】图的遍历方法 深度优先遍历和广度优先遍历

图的遍历方法 深度优先遍历和广度优先遍历 接着上次的文章“图的构建(邻接链表法)”,邻接链表法构建图相对来说比较简单,并且遍历起来也相对简单,但是要是动态添加图的节点和图的边,则是实在不方便,不过现在不管那么多,今天的主题是遍历。  - 有另外一种图的构建方法,叫做十字链表法,插入删除比较方便,但是相对来说比较复杂,改天闲着木事的再搞。(其实主要原因是因为三四年前写的代码,现在翻出来了,现成的

sundong_d的专栏 2万+

【实验】C语言:包括图的建立、深度优先遍历和广度优先遍历

然后,您可以输入必要的值,例如顶点和边的数量,并查看深度优先和广度优先遍历的结果。请注意,提供的代码示例假设您有基本的图论和数据结构知识。您需要根据任务的要求和指导实现剩余的功能和数据结构。以下是完整的C语言代码示例,包括图的建立、深度优先遍历和广度优先遍历的实现。1.输入指定的边数和顶点数建立图,并输出深度优先遍历和广度优先遍历的结果。int vexnum,arcnurm://J顶点的实际数,边的实际数。1)问题描述:在主程序中设计一个简单的菜单,分别调用相应的函数功。1/边的权了ArCNode;

走向CTO的路上... 1266

Spark Graphx 项目实战(航班飞行网图分析)

航班飞行网图分析一.需要的技能点二.任务描述三.数据探索1.下载数据2.数据格式四.航班飞行网图问题分析1.构建航班飞行网图2.统计航班飞行网图中机场与航线的数量3.计算最长的飞行航线4.找出最繁忙的机场5.找出最重要的飞行航线6.找出最便宜的飞行航线五.代码实现 一.需要的技能点 Spark GraphX API Spark GraphX PageRank Spark GraphX Pregel 二.任务描述 需求概述: 探索航班飞行网图数据 构建航班飞行网图 使用Spark GraphX完成下列任

May_J_Oldhu的博客 1538

磁栅尺的基本原理

一、磁栅尺简介 磁栅尺(Magnetic scale)是一种常见于工业自动化设备领域的线性位移测量方案,因为其耐用性强,对环境要求不高,逐渐替代了对环境要求苛刻的光学直线测量方案。 作为自动化设备领域里不多见的精密位移检测方案,磁栅尺使用广泛,尤其适用于检测行程长、测量精度要求高、工况复杂的大型机床。磁栅尺安装方便,抗干扰能力强,抗冲击性强,不易受到振动、粉尘、水垢、油污等影响,耐高温和耐低温性能也较为突出。 二、磁栅尺基本组成与原理 磁栅尺主要由两个部分组成,磁尺和读磁头。 磁尺 磁尺是磁栅尺

Luckboy_shy的博客 1万+

Kubernetes+EdgeX:构建企业级AI边缘推理平台

设备:工业摄像头(RTSP协议,输出1920x1080视频流);AI模型:YOLOv8训练的轴承裂纹检测模型(识别“裂纹”“正常”两种类型);目标:摄像头采集图像→EdgeX传输数据→K8s推理服务检测→结果反馈到报警器(HTTP协议)。Kubernetes+EdgeX的组合,为企业构建AI边缘推理平台提供了标准化、可扩展标准化:K8s的容器编排和EdgeX的设备管理,都是行业标准,避免“重复造轮子”;可扩展:支持从单边缘节点到 thousands of nodes 的规模,满足企业的增长需求;

AI算力网络与通信的博客 1343

CMOS 半加器和全加器&&数字集成电路&& Cadence Virtuoso

数字集成电路——半加器和全加器

计科小学生的博客 1万+

水电站数字孪生:水力发电在可视化领域的应用

为智慧水坝领域提供了 B/S 架构的基于 WebGL 的图形引擎,与 GIS、粒子仿真、虚拟现实、边缘计算等技术相结合,融合多元业务系统数据,形成数字孪生界面,助力水利水电工程进一步提升数字化水平,乃至为整个工业领域添砖加瓦。

二三维数据可视化/数字孪生 2255

ISO 15118-3协议栈开发避坑指南:从EvseSlac状态机设计看电动汽车充电握手难题

本文深入剖析了ISO 15118-3协议栈开发中的核心挑战,特别是SLAC握手流程的实现难点。以Everest项目的EvseSlac状态机为例,详细解读了从状态机设计、多厂商PLC芯片兼容性处理,到严苛的时序与超时控制等关键工程实践,为开发者提供了一套超越协议文档的、可直接落地的避坑指南和软件实现方案。

jump7的博客 265

基于知识图谱的时空事件关联推理能力培养

随着信息技术的飞速发展,大量的时空事件数据被产生和收集,如交通流量数据、气象观测数据、社交媒体上的地理定位信息等。这些数据蕴含着丰富的知识和规律,但要从中提取有价值的信息并非易事。基于知识图谱的时空事件关联推理旨在通过构建知识图谱,将时空事件数据进行整合和关联,从而实现对事件之间潜在关系的挖掘和推理。本文的目的是系统地介绍基于知识图谱的时空事件关联推理能力的培养方法,包括核心概念、算法原理、数学模型、实际应用等方面。

操作系统内核探秘的博客 750

SOME/IP协议详解「1.0·概述」

主要讲解什么是someip,

雪云飞星的博客 5366

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

上一篇: ChatGPT使用api_key本地部署
下一篇: 算法详解——贪心算法
晓shuo
晓shuo 优质创作者: 人工智能技术领域 优质创作者: 人工智能技术领域
博客等级 码龄6年 4万+粉丝 113原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晓shuo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值