算法-图的广度优先搜索,图的深度优先搜索

1.图的广度优先搜索
(1). 定义
图的广度优先搜索(Breadth-First Search, BFS)是一种用于遍历或搜索树或图的算法。这个算法从图的某一节点(源节点)开始,探索最靠近源节点的节点,然后是一层一层地向外扩展,直到找到目标节点或遍历完整个图。

下面是广度优先搜索的基本步骤:
a. 创建一个队列,将源节点入队。
b. 对源节点执行访问,同时标记其已经被访问。
c. 当队列不为空时,循环执行以下步骤:
c.1. 从队列中取出一个节点。
c.2. 遍历该节点的所有邻居节点。如果邻居节点未被访问过,访问此节点,再将其加入队列和标记其已经被访问。
d. 算法结束。

在广度优先搜索中,所有从源节点出发,到达同一层级的节点,都会被一同处理。因此,广度优先搜索可以找到从源节点到目标节点的最短路径(如果目标节点存在的话),这里的“最短”指的是路径上边的数量最少。

在编程实现广度优先搜索时,通常会用到队列这种数据结构,因为队列的特性是先进先出(FIFO),这正好符合广度优先搜索逐层向外扩展的需求。

值得注意的是,广度优先搜索在某些情况下可能不是最优的,例如当图很大或者结构复杂时,它可能需要遍历很多节点才能找到目标节点。在这种情况下,可能需要考虑使用其他搜索算法,如深度优先搜索(DFS)或启发式搜索算法等。

(2). 实例
在这里插入图片描述
针对上述图结构,我们可以借助广度优先搜索计算并打印一条AG的边数最少的路径.

2.图的深度优先搜索
(1). 定义
深度优先搜索(Depth-First Search,DFS)是一种用于遍历或搜索树或图的算法。这个算法会尽可能深地搜索树的分支。当节点v的所在边都已被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。

在图的深度优先搜索中,基本的思想是从某个顶点v开始,首先访问该顶点,然后依次从v的未被访问的邻接点出发,对图进行深度优先遍历,直至图中和v有路径相通的顶点都被访问。如果此时图中尚有顶点未被访问,则从一个未被访问的顶点出发,重新进行深度优先遍历,直到图中所有顶点均被访问过为止。

深度优先搜索的具体步骤可以总结如下:
(1). 访问顶点v
(2). 依次从v的未被访问的邻接点出发,对图进行深度优先遍历;直至图中和v有路径相通的顶点都被访问。

若此时图中尚有顶点未被访问,则从一个未被访问的顶点出发,重新进行深度优先遍历,直到图中所有顶点均被访问过为止。需要注意的是,深度优先搜索的结果可能不唯一,因为搜索的顺序可能因不同的邻接点选择顺序而有所变化。

深度优先搜索在许多应用中都有重要的作用,如网络爬虫、人工智能、编译器设计等。在网络爬虫中,深度优先搜索可以帮助我们按照特定的路径去遍历网页;在人工智能中,深度优先搜索可以用于求解迷宫问题等;在编译器设计中,深度优先搜索可以用于语法分析树的构建等。

总的来说,深度优先搜索是一种强大且灵活的算法,可以处理各种复杂的图结构问题。
(2). 实例
在这里插入图片描述
上述是一个由边和节点构成的图结构.我们可以利用深度优先搜索找到从AE的所有可行路径.并输出其中边数最少的一条路径的变数,及路径上的节点信息.

class NodeInfo{
public:char m_nName;
};template<class T>
class Node{
public:T m_nEle;
};template<class EdgeInfo>
class Edge{
public:bool m_bValid = false;
};Node<NodeInfo> stNodes[10];
Edge<int> stEdges[10][10];
int ArrPath[1000][10];
int PathNum = 0;
int MinPath[10];
int MinNum = 10;
void Visit(int nCurIndex, int nEndIndex, int (&ArrIndex)[10], int nNum);
int main(){stNodes[0].m_nEle.m_nName = 'A';stNodes[1].m_nEle.m_nName = 'B';stNodes[2].m_nEle.m_nName = 'C';stNodes[3].m_nEle.m_nName = 'D';stNodes[4].m_nEle.m_nName = 'E';stNodes[5].m_nEle.m_nName = 'F';stNodes[6].m_nEle.m_nName = 'G';stNodes[7].m_nEle.m_nName = 'H';stNodes[8].m_nEle.m_nName = 'I';stNodes[9].m_nEle.m_nName = 'J';stEdges[0][1].m_bValid = true;stEdges[0][6].m_bValid = true;stEdges[1][2].m_bValid = true;stEdges[2][3].m_bValid = true;stEdges[2][5].m_bValid = true;stEdges[3][4].m_bValid = true;stEdges[5][3].m_bValid = true;stEdges[5][9].m_bValid = true;stEdges[6][5].m_bValid = true;stEdges[6][8].m_bValid = true;stEdges[7][6].m_bValid = true;stEdges[8][7].m_bValid = true;stEdges[8][9].m_bValid = true;stEdges[9][4].m_bValid = true;// 找到从A到E的所有可能路径int nFirstIndex = 0;int nEndIndex = 4;int ArrIndex[10];int nNum = 0;// 深度优先遍历Visit(nFirstIndex, nEndIndex, ArrIndex, nNum);// 打印结果printf("min path:%d\n", MinNum);for(int i = 0; i < MinNum; i++){printf("%c ", stNodes[MinPath[i]].m_nEle.m_nName);}printf("\n");printf("path num:%d\n", PathNum);while(true){printf("path index:\n");int nIndex = 0;scanf("%d", &nIndex);getchar();if(nIndex < 0){break;}for(int i = 0; i < 10; i++){printf("%c ", stNodes[ArrPath[nIndex][i]].m_nEle.m_nName);}printf("\n");}return 0;
}
// 从nCurIndex开始到nEndIndex的所有路径
void Visit(int nCurIndex, int nEndIndex, int (&ArrIndex)[10], int nNum){// 访问当前节点//stNodes[nCurIndex].m_nEle.m_bVisit = true;ArrIndex[nNum] = nCurIndex;nNum++;if(nCurIndex == nEndIndex){// 记录for(int i = 0; i < nNum; i++){ArrPath[PathNum][i] = ArrIndex[i];}PathNum++;// 比较&更新if(nNum < MinNum){MinNum = nNum;for(int i = 0; i < nNum; i++){MinPath[i] = ArrIndex[i];}}return;}// 在当前阶段基础上,继续走向每个分支for(int i = 0; i < 10; i++){int nOldNum = nNum;// 从当前沿着此分支继续走下去if(stEdges[nCurIndex][i].m_bValid){// 剪分支// 待访问节点不能已经出现在累计的访问路径上.将环路排除在结果外.int k = 0;for(; k < nNum; k++){if(ArrIndex[k] == i){break;}}if(k >= nNum){Visit(i, nEndIndex, ArrIndex, nNum);}}// 分支走完需要撤销影响.以便继续从当前沿着后续分支继续走.防止数据被污染.走的过程中需要记录和更新的内容已经记录下来了.nNum = nOldNum;}
}

上述算法是一个典型的深度优先,递归,动态规划性质的算法.
此类算法典型特征:
(1). 递归算法.
(2). 参数部分提供当前阶段,截止阶段信息(方便知道何时停止后续递归),累计到当前的阶段性信息.
(3). 访问当前设计对阶段性信息记录,及到达截止阶段时比较&更新全局信息.
(4). 从当前节点继续走向可行分支.
要走向的分支得存在.
需要进行剪枝分析.具体到上述,因为我们要求解最短路径,所以,需剪掉出现环路的分支.
(5). 走完一个分支后,需防止数据被污染.要分析从上一分支走的过程中那些数据被污染了,并判断是否需恢复.具体到上述,我们维护的阶段性信息被污染了.重新走后续分支时,我们需将其恢复到走首个分支前的状态.因为上述我们需借助阶段性信息来记录从起点到终点的路径信息.

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

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

相关文章

蓝桥杯B组C++省赛 全球变暖【bfs】

题目描述&#xff1a; 你有一张某海域NxN像素的照片&#xff0c;"."表示海洋、"#"表示陆地&#xff0c;如下所示&#xff1a; ....... .##.... .##.... ....##. ..####. ...###. ....... 其中"上下左右"四个方向上连在一起的一片陆地组成一座…

SurfaceFlinger的面试题目

题目&#xff1a;简述SurfaceFlinger在Android系统中的作用是什么&#xff1f; **答案&#xff1a;**SurfaceFlinger是Android图形系统的核心组件之一&#xff0c;它负责合成各个应用程序产生的图形缓冲区内容&#xff0c;并将最终的图像呈现到屏幕上。SurfaceFlinger管理多个S…

211本科搞前端好找工作吗?AI程序员对程序员的影响有多大?

211本科去搞前端好找工作吗? 最近看到网友有问到这个问题,211本科搞前端好找工作吗?那么我根据自己的工作经历来深度聊聊网上的这个问题。 本人计算机硕士,在前端领域干了7年。我毕业后先后在上市国企,上市云计算公司,现在在一家正在IPO的公司,做新能源无人驾驶赛道,…

EDIUS11新版中国首发!新增多个AI功能比Sora更强!

2024年2月27日&#xff0c;中国苏州 - 著名专业视频剪辑工具EDIUS正式推出中国地区的最新版本EDIUS11。这次发布距上一版已有3年时间&#xff0c;EDIUS11带来了一系列创新&#xff0c;开发商Grass Valley团队引入了多项人工智能功能&#xff0c;涵盖特效、调色、降噪等多个方面…

网络安全必修课:20个核心知识点大揭秘

1、什么是SQL注入攻击 概述 攻击者在 HTTP 请求中注入恶意的 SQL 代码&#xff0c;服务器使用参数构建数据库 SQL 命令时&#xff0c;恶意SQL 被一起构造&#xff0c;并在数据库中执行。 注入方法 用户登录&#xff0c;输入用户名 lianggzone&#xff0c;密码 ‘ or ‘1’’…

XSS漏洞及其工具Beef使用

XSS(Cross Site Scripting,跨站脚本漏洞)漏洞&#xff0c;又叫 CSS 漏洞&#xff0c;是最常见的 Web 应用程序漏洞。其主要原理是当动态页面中插入的内容含有特殊字符(如<)时&#xff0c;用户浏览器会将其误认为是插入了HTML 标签&#xff0c;当这些HTML标签引入了一段 Java…

电脑文件msvcp100.dll丢失原因,如何快速修复msvcp100.dll

电脑文件msvcp100.dll丢失原因&#xff0c;最近有朋友在问这个&#xff0c;显然会问这个的人&#xff0c;一般都是遇到了msvcp100.dll丢失的问题了&#xff0c;今天我们就来详细的给大家说说msvcp100.dll这个文件吧&#xff0c;我们只有了解了msvcp100.dll这个文件&#xff0c;…

【C++ CSES】Gray Code

题目描述 A Gray code is a list of all 2^n bit strings of length n, where any two successive strings differ in exactly one bit (i.e., their Hamming distance is one). Your task is to create a Gray code for a given length n. 输入 The only input line has an…

链表详解-leetcode203.移除链表元素

链表 移除链表元素 题目&#xff1a; 题意&#xff1a;删除链表中等于给定值 val 的所有节点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xff1a;[1,2,3,4,5] 示例 2&#xff1a; 输入&#xff1a;head [], val 1 输出&#xff1a;[…

十九、软考-系统架构设计师笔记-真题解析-2021年真题

软考-系统架构设计师-2021年上午选择题真题 考试时间 8:30 ~ 11:00 150分钟 1.前趋图(Precedence Graph)是一个有向无环图&#xff0c;记为&#xff1a;→(Pi,Pj)Pi must Complete Before Pj may strat), 假设系统中进程P{P1, P2,P3,P4, P5, P6, P7, P8}&#xff0c; 且进程的…

AI交互数字人应用在教育领域有何作用?

AI数字人在教育领域中&#xff0c;除了可以承担个性化教学辅导、沉浸式数字课堂、虚拟仿真实训室中&#xff0c;还可以作为AI交互数字人提供情感陪伴和心理辅导。与真人心理老师相比&#xff0c;AI交互数字人更具高度隐私保密性&#xff0c;可以为学生提供精确及个性化的咨询服…

【视频教程】苹果推送证书生成及如何对接环信推送

1、如何生成p8证书并上传到环信后台 苹果推送p8证书生成教程 2、如何生成苹果推送p12证书并上传到环信后台 苹果证书p12证书生成 3、如何在项目中对接环信推送&#xff08;iOS&#xff09; 如何在项目中对接环信推送&#xff08;iOS&#xff09; 更多教程&#xff1a; 注册环信…

LlamaParse:RAG中高效解析复杂PDF的最佳选择

一、前言 在过去的一年中&#xff0c;RAG&#xff08;Retrieval-Augmented Generation&#xff09;模型在信息检索和自然语言处理领域取得了显著的进展&#xff0c;但同时也面临着一系列挑战。尤其是在处理复杂PDF文档时&#xff0c;RAG模型的局限性变得尤为明显。这些文档通常…

SpringBoot ---HTML转PDF工具

之前项目用的WKHtmlToPdf&#xff0c;速度较慢&#xff0c;现在需要改成基于ITEXT java使用itext7实现html转pdf_java使用itext7实现html转pdf全代码完整示例 cainiaobulan-CSDN博客文章浏览阅读2.7k次。使用itext7html转pdf_java使用itext7实现html转pdf全代码完整示例 caini…

SpringBoot自定义starter开发:定时任务报表开发

&#x1f648;作者简介&#xff1a;练习时长两年半的Java up主 &#x1f649;个人主页&#xff1a;程序员老茶 &#x1f64a; ps:点赞&#x1f44d;是免费的&#xff0c;却可以让写博客的作者开心好久好久&#x1f60e; &#x1f4da;系列专栏&#xff1a;Java全栈&#xff0c;…

C语言学习笔记day12

1. 函数的定义 函数类型 函数名(数据类型1 形式参数1, 数据类型2 形式参数2, ...) { 函数体; return 返回值; } 函数类型: 函数运行结果的类型 函数名: 1.可以由字母、数字、下划线组成,不能以数字开头…

两个实体字段不一致,但是字段的值相同 使用注解和反射进行转换 可以避免get和set方法

一个公司两个系统&#xff0c;创建的实体含义一样&#xff0c;但是字段不一致&#xff0c;用get和set方法转换太恶心&#xff0c;而且容易空指针&#xff0c;所以使用注解和反射来写&#xff0c;特地记录一下&#xff0c;有要用的同学可以拿去用哈。 上代码&#xff1a; packa…

muduo异步日志

muduo异步日志实现 陈硕老师的muduo网络库的异步日志的实现&#xff0c;今晚有点晚了&#xff0c;我明晚再把这个异步日志抽出来&#xff0c;作为一个独立的日志库。 所在文件 AsyncLogging.cc AsyncLogging.h LogFile.h LogFile.cc CountDownLatch.h CountDownLatch.cc…

美团2023年财报:全年营收2767亿元,即时配送订单219亿笔

3月22日&#xff0c;美团(股票代码:3690.HK)发布2023年第四季度及全年业绩。公司各项业务继续取得稳健增长&#xff0c;全年营收2767亿元(人民币&#xff0c;下同)&#xff0c;同比增长26%&#xff0c;经营利润134亿元。 本年度&#xff0c;美团继续围绕“零售科技”战略&…

openlayers 入门教程(四):layers 篇

还是大剑师兰特&#xff1a;曾是美国某知名大学计算机专业研究生&#xff0c;现为航空航海领域高级前端工程师&#xff1b;CSDN知名博主&#xff0c;GIS领域优质创作者&#xff0c;深耕openlayers、leaflet、mapbox、cesium&#xff0c;canvas&#xff0c;webgl&#xff0c;ech…