为什么深度优先搜索可以判定简单图中是否有环,而宽度优先搜索不行?

2024-02-26 22:59

本文主要是介绍为什么深度优先搜索可以判定简单图中是否有环,而宽度优先搜索不行?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一,前言

本文是原创作品,可能有所不足,敬请指正,礼貌交流,感激不尽。

二,前提知识

1,简单图

简单图是指满足以下条件的图:没有连接顶点和其自身的边、不存在平行边。

2,环

这里我们讨论的是简单回路(环),也就是指除了第一个顶点和最后一个顶点相同以外、其他顶点不重复出现的回路。

3,树(单指无向树)的定义是连通无回路的无向图。

约定:

1,以下的“宽搜”二字代表宽度优先搜索,深搜代表深度优先搜索。

2,以下的图均指简单连通图

三,正文

1,首先可以肯定的是,对于无向图而言,宽搜和深搜都能判断是否有环。

简要说明一下,假如一个无向图有环,那么在宽搜的过程中,能搜到已经访问过的结点。如果一个无向图没有环(参考无向树),那么它的宽度优先搜索过程中,是不会访问到已访问过的结点的。

对于深搜,如果一个简单无向图有环,那么深搜的栈保存的结点形成的路径(以下简称深搜结点路径)会有回边(指向栈中结点的边)。但是没有环的话,就不会出现这种情况。

2,对于有向图而言,它们中只有深搜能判断是否有环。

首先对于有向图而言,无论有没有环,宽搜都有可能搜到已访问过的结点。如下图:

当结点B,C都进入了宽搜的队列,那么它们会先后访问D结点,这时就出现了访问已访问过的结点的情况。但是此时该图没有环。 

因此,之前的那个办法不能判断了。

但是深搜依然可以。如果简单有向图中存在环,深搜结点路径依然会出现回边。

四,写在最后

如有错误,敬请指正,礼貌交流,感激不尽

附录,有小伙伴提到了深搜判断无向图是否有环,我写了一下伪代码,逻辑不一定严密,但是大体上应该没错,如有错误,欢迎指正

#include<iostream>
#define N 5
using namespace std;
bool DFS(int node, int tag[],int graph[][5], int parent[])//通过深搜判断无向图是否有环
{//node代表当前结点,tag[i]等于0代表该结点没有在深搜的栈中,tag[i]等于1代表当前结点在深搜的栈中。
//graph数组代表图的邻接矩阵,N代表结点个数,
//parent[i]等于j,代表当前深搜的栈中结点i的前驱是j ,也即访问i之后就立马访问j了 
//该函数返回false代表有环,否则代表无环 if(tag[node] == 1)return false;//遇到回边就返回false else tag[node] = 1;bool res = true;for(int i=0;i<N;i++){if(graph[node][i] > 0 && parent[node] != i)//如果结点node和i之间存在一条边,当前结点的父节点不应该访问 {parent[i] = node;res = DFS( i,  tag, graph, parent);if(res == false)break;//只要有一条回边,就代表整个图有环 parent[i] = -1;tag[i] = 0; } }return res;
} 
int main()
{return 0;
} 

这篇关于为什么深度优先搜索可以判定简单图中是否有环,而宽度优先搜索不行?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/750436

相关文章

一份LLM资源清单围观技术大佬的日常;手把手教你在美国搭建「百万卡」AI数据中心;为啥大模型做不好简单的数学计算? | ShowMeAI日报

👀日报&周刊合集 | 🎡ShowMeAI官网 | 🧡 点赞关注评论拜托啦! 1. 为啥大模型做不好简单的数学计算?从大模型高考数学成绩不及格说起 司南评测体系 OpenCompass 选取 7 个大模型 (6 个开源模型+ GPT-4o),组织参与了 2024 年高考「新课标I卷」的语文、数学、英语考试,然后由经验丰富的判卷老师评判得分。 结果如上图所

JavaScript全屏,监听页面是否全屏

在JavaScript中,直接监听浏览器是否进入全屏模式并不直接支持,因为全屏API主要是关于请求和退出全屏模式的,而没有直接的监听器可以告知页面何时进入或退出全屏模式。但是,你可以通过在你的代码中跟踪全屏状态的改变来模拟这个功能。 以下是一个基本的示例,展示了如何使用全屏API来请求全屏模式,并在请求成功或失败时更新一个状态变量: javascriptlet isInFullscreen =

回调的简单理解

之前一直不太明白回调的用法,现在简单的理解下 就按这张slidingmenu来说,主界面为Activity界面,而旁边的菜单为fragment界面。1.现在通过主界面的slidingmenu按钮来点开旁边的菜单功能并且选中”区县“选项(到这里就可以理解为A类调用B类里面的c方法)。2.通过触发“区县”的选项使得主界面跳转到“区县”相关的新闻列表界面中(到这里就可以理解为B类调用A类中的d方法

自制的浏览器主页,可以是最简单的桌面应用,可以把它当成备忘录桌面应用

自制的浏览器主页,可以是最简单的桌面应用,可以把它当成备忘录桌面应用。如果你看不懂,请留言。 完整代码: <!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><ti

python实现最简单循环神经网络(RNNs)

Recurrent Neural Networks(RNNs) 的模型: 上图中红色部分是输入向量。文本、单词、数据都是输入,在网络里都以向量的形式进行表示。 绿色部分是隐藏向量。是加工处理过程。 蓝色部分是输出向量。 python代码表示如下: rnn = RNN()y = rnn.step(x) # x为输入向量,y为输出向量 RNNs神经网络由神经元组成, python

宝塔面板部署青龙面板教程【简单易上手】

首先,你得有一台部署了宝塔面板的服务器(自己用本地电脑也可以)。 宝塔面板部署自行百度一下,很简单,这里就不走流程了,官网版本就可以,无需开心版。 首先,打开宝塔面板的软件商店,找到下图这个软件(Docker管理器)安装,青龙面板还是安装在docker里,这里依赖宝塔面板安装和管理docker。 安装完成后,进入SSH终端管理,输入代码安装青龙面板。ssh可以直接宝塔里操作,也可以安装ssh连接

好书推荐《深度学习入门 基于Python的理论与实现》

如果你对Python有一定的了解,想对深度学习的基本概念和工作原理有一个透彻的理解,想利用Python编写出简单的深度学习程序,那么这本书绝对是最佳的入门教程,理由如下:     (1)撰写者是一名日本普通的AI工作者,主要记录了他在深度学习中的笔记,这本书站在学习者的角度考虑,秉承“解剖”深度学习的底层技术,不使用任何现有的深度学习框架、尽可能仅使用基本的数学知识和Python库。从零创建一个

【文末附gpt升级秘笈】腾讯元宝AI搜索解析能力升级:千万字超长文处理的新里程碑

腾讯元宝AI搜索解析能力升级:千万字超长文处理的新里程碑 一、引言 随着人工智能技术的飞速发展,自然语言处理(NLP)和机器学习(ML)在各行各业的应用日益广泛。其中,AI搜索解析能力作为信息检索和知识抽取的核心技术,受到了广泛的关注和研究。腾讯作为互联网行业的领军企业,其在AI领域的探索和创新一直走在前列。近日,腾讯旗下的AI大模型应用——腾讯元宝,迎来了1.1.7版本的升级,新版本在AI搜

XMG Quartz2D的简单使用

// //  Quratz2DView.m //  Quartz2D // //  Created by 王宁 on 16/5/6. //  Copyright © 2016年 ylshmacmini. All rights reserved. // #import "Quratz2DView.h" //Quartz@2D是一个二维绘图引擎,同时支

网页脚本输入这么简单

如何在网页中进行脚本操作呢? 研究了一下,很简单,用google浏览器的Console直接操作javaScript。思路: Created with Raphaël 2.1.0 开始 输入(如何输入) 点击(如何点击) 结束 下面是,通过脚本刷直播屏的实现,直接在Console输入即可 var words=new Arra