当前位置: 首页 > news >正文

如何避免广度优先搜索(BFS)在有环图中陷入无限循环

要避免广度优先搜索(BFS)在有环图中陷入无限循环,关键在于记录已访问的节点。当检测到节点已被访问过时,跳过对该节点的进一步处理。

具体实现方法

  1. 使用哈希集合(HashSet)记录访问状态
    在 BFS 开始前创建一个集合,每次访问一个节点时将其加入集合。若后续再次遇到该节点,则跳过。

  2. 改进队列元素结构(可选)
    若需记录路径信息,可将队列中的元素改为 (节点, 路径) 的形式,但仍需单独维护一个访问集合以避免重复。

示例代码

以下是避免无限循环的 BFS 实现:

from collections import dequedef bfs(graph, start):visited = set()  # 记录已访问的节点queue = deque([start])visited.add(start)  # 初始节点标记为已访问while queue:current = queue.popleft()print(f"访问节点: {current}")  # 处理当前节点# 遍历当前节点的所有邻居for neighbor in graph.get(current, []):if neighbor not in visited:visited.add(neighbor)  # 标记邻居为已访问queue.append(neighbor)  # 加入队列待处理# 示例图结构(有环)
graph = {'a': ['b'],'b': ['c'],'c': ['a']  # 形成环路 a->b->c->a
}bfs(graph, 'a')  # 从节点a开始BFS

代码解释

  • visited 集合:使用 Python 的set记录已访问的节点,确保每个节点仅被处理一次。
  • 队列操作:每次从队列取出节点后,仅将未访问的邻居加入队列,避免重复处理。
  • 环路处理:即使图中存在环路(如示例中的a->b->c->a),由于visited的存在,算法仍会在遍历完所有节点后终止。

复杂度分析

  • 时间复杂度:O (V + E),其中 V 是节点数,E 是边数。每个节点和每条边都会被处理一次。
  • 空间复杂度:O (V),主要用于存储访问集合和队列。
http://www.dtcms.com/a/288564.html

相关文章:

  • ADC和DMA简述
  • 第四次作业
  • linux + 宝塔面板 部署 django网站 启动方式:uwsgi 和gunicorn如何选择 ?
  • 用 Jetpack Compose 写 Android 的 “Hello World”
  • windows + phpstorm 2024 + phpstudy 8 + php7.3 + thinkphp6 配置xdebug调试
  • YOLOv8目标检测项目代码详解与习题
  • C++ 桶排序、基数排序、堆排序
  • C++ - 仿 RabbitMQ 实现消息队列--服务端核心模块实现(一)
  • Spring之事务使用指南
  • spring-ai-alibaba如何上传文件并解析
  • 前端环境搭建---基于SpringBoot+MySQL+Vue+ElementUI+Mybatis前后端分离面向小白管理系统搭建
  • RK3588 安卓adb操作
  • [HDLBits] Cs450/gshare
  • 42.sentinel实现线程隔离
  • 嵌入式硬件篇---继电器
  • 06 51单片机之矩阵键盘
  • XSS GAME靶场
  • XSS的学习笔记
  • vscode环境下c++的常用快捷键和插件
  • tabBar设置底部菜单选项、iconfont图标(图片)库、模拟京东app的底部导航栏
  • 基于深度学习的日志分析系统实现方案,使用Python构建CNN模型进行日志诊断
  • 在NLP深层语义分析中,深度学习和机器学习的区别与联系
  • 苍穹外卖|项目日记(完工总结)
  • Mobile Neural Network (MNN) 3.2.1
  • docker-compose启动前后端分离项目(单机)
  • ABP VNext + Playwright E2E:前后端一体化自动化测试
  • 秒赤Haproxy配置算法
  • The law and schools
  • 锂电池充电芯片
  • 文档表格标题跑到表格下方,或标题跟表格空隔太大如何处理