Python数据结构与算法之图的广度优先与深度优先搜索算法示例


Posted in Python onDecember 14, 2017

本文实例讲述了Python数据结构与算法之图的广度优先与深度优先搜索算法。分享给大家供大家参考,具体如下:

根据维基百科的伪代码实现:

广度优先BFS:

使用队列集合

标记初始结点已被发现,放入队列

每次循环从队列弹出一个结点

将该节点的所有相连结点放入队列,并标记已被发现

通过队列,将迷宫路口所有的门打开,从一个门进去继续打开里面的门,然后返回前一个门处

"""
 procedure BFS(G,v) is
   let Q be a queue
   Q.enqueue(v)
   label v as discovered
   while Q is not empty
    v ← Q.dequeue()
    procedure(v)
    for all edges from v to w in G.adjacentEdges(v) do
      if w is not labeled as discovered
        Q.enqueue(w)
        label w as discovered
"""
def procedure(v):
  pass
def BFS(G,v0):
  """ 广度优先搜索 """
  q, s = [], set()
  q.extend(v0)
  s.add(v0)
  while q:  # 当队列q非空
    v = q.pop(0)
    procedure(v)
    for w in G[v]:   # 对图G中顶点v的所有邻近点w
      if w not in s: # 如果顶点 w 没被发现
        q.extend(w)
        s.add(w)  # 记录w已被发现

深度优先DFS

使用 集合

初始结点入栈

每轮循环从栈中弹出一个结点,并标记已被发现

对每个弹出的结点,将其连接的所有结点放到队列中

通过栈的结构,一步步深入挖掘

""""
Pseudocode[edit]
Input: A graph G and a vertex v of G
Output: All vertices reachable from v labeled as discovered
A recursive implementation of DFS:[5]
1 procedure DFS(G,v):
2   label v as discovered
3   for all edges from v to w in G.adjacentEdges(v) do
4     if vertex w is not labeled as discovered then
5       recursively call DFS(G,w)
A non-recursive implementation of DFS:[6]
1 procedure DFS-iterative(G,v):
2   let S be a stack
3   S.push(v)
4   while S is not empty
5      v = S.pop()
6      if v is not labeled as discovered:
7        label v as discovered
8        for all edges from v to w in G.adjacentEdges(v) do
9          S.push(w)
"""
def DFS(G,v0):
  S = []
  S.append(v0)
  label = set()
  while S:
    v = S.pop()
    if v not in label:
      label.add(v)
      procedure(v)
      for w in G[v]:
        S.append(w)

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python 连连看连接算法
Nov 22 Python
pyqt4教程之实现windows窗口小示例分享
Mar 07 Python
Python中函数的多种格式和使用实例及小技巧
Apr 13 Python
深入理解Python装饰器
Jul 27 Python
Django基础之Model操作步骤(介绍)
May 27 Python
python实现简单tftp(基于udp协议)
Jul 30 Python
Python爬取个人微信朋友信息操作示例
Aug 03 Python
Python多进程池 multiprocessing Pool用法示例
Sep 07 Python
对Python中的条件判断、循环以及循环的终止方法详解
Feb 08 Python
Django异步任务之Celery的基本使用
Mar 23 Python
通过python连接Linux命令行代码实例
Feb 18 Python
Python OpenCV超详细讲解调整大小与图像操作的实现
Apr 02 Python
python实现发送邮件功能代码
Dec 14 #Python
python正则实现计算器功能
Dec 14 #Python
Python数据结构与算法之使用队列解决小猫钓鱼问题
Dec 14 #Python
python实现BackPropagation算法
Dec 14 #Python
python实现随机梯度下降(SGD)
Mar 24 #Python
Python实现将一个正整数分解质因数的方法分析
Dec 14 #Python
Python随机生成均匀分布在三角形内或者任意多边形内的点
Dec 14 #Python
You might like
解决php用mysql方式连接数据库出现Deprecated报错问题
2019/12/25 PHP
jquery时间下拉框小例子
2013/04/15 Javascript
javascript在myeclipse中报错的解决方法
2013/10/29 Javascript
jQuery原生的动画效果
2015/07/10 Javascript
JS折半插入排序算法实例
2015/12/02 Javascript
解析Node.js基于模块和包的代码部署方式
2016/02/16 Javascript
微信js-sdk预览图片接口及从拍照或手机相册中选图接口用法示例
2016/10/13 Javascript
Js动态设置rem来实现移动端字体的自适应代码
2016/10/14 Javascript
JavaScript之排序函数_动力节点Java学院整理
2017/06/30 Javascript
微信小程序tabBar模板用法实例分析【附demo源码下载】
2017/11/28 Javascript
如何解决React官方脚手架不支持Less的问题(小结)
2018/09/12 Javascript
对angular 监控数据模型变化的事件方法$watch详解
2018/10/09 Javascript
Element 默认勾选表格 toggleRowSelection的实现
2019/09/04 Javascript
使用layui日期控件laydate对开始和结束时间进行联动控制的方法
2019/09/06 Javascript
谈谈我在vue-cli3中用预渲染遇到的坑
2020/04/22 Javascript
基于elementUI竖向表格、和并列的案例
2020/10/26 Javascript
[51:17]VGJ.T vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
[01:59]游戏“zheng”当时试玩会
2019/08/21 DOTA
python使用datetime模块计算各种时间间隔的方法
2015/03/24 Python
如何用C代码给Python写扩展库(Cython)
2019/05/17 Python
python制作简单五子棋游戏
2019/06/18 Python
Django操作session 的方法
2020/03/09 Python
解决django无法访问本地static文件(js,css,img)网页里js,cs都加载不了
2020/04/07 Python
Python多线程:主线程等待所有子线程结束代码
2020/04/25 Python
PyQt5如何将.ui文件转换为.py文件的实例代码
2020/05/26 Python
python 如何读、写、解析CSV文件
2021/03/03 Python
CSS3 优势以及网页设计师如何使用CSS3技术
2009/07/29 HTML / CSS
突袭HTML5之Javascript API扩展5—其他扩展(应用缓存/服务端消息/桌面通知)
2013/01/31 HTML / CSS
英国人最爱的饰品网站:Accessorize
2016/08/22 全球购物
英国和爱尔兰最大的地毯零售商:Kukoon
2018/12/17 全球购物
什么是数据抽象
2016/11/26 面试题
我是一名护士演讲稿
2014/08/28 职场文书
推普周活动总结
2014/08/28 职场文书
办公室主任个人总结
2015/02/28 职场文书
召开会议通知范文
2015/04/15 职场文书
pytorch MSELoss计算平均的实现方法
2021/05/12 Python