zoukankan      html  css  js  c++  java
  • 图的广度优先搜索(BFS)与深度优先搜索(DFS) Python实现

    1.广度优先搜索

     1 # 图的广度优先遍历
     2 # 1.利用队列实现
     3 # 2.从源节点开始依次按照宽度进队列,然后弹出
     4 # 3.每弹出一个节点,就把该节点所有没有进过队列的邻接点放入队列
     5 # 4.直到队列变空
     6 from queue import Queue
     7 def bfs(node):
     8     if node is None:
     9         return
    10     queue = Queue()
    11     nodeSet = set()
    12     queue.put(node)
    13     nodeSet.add(node)
    14     while not queue.empty():
    15         cur = queue.get()               # 弹出元素
    16         print(cur.value)                # 打印元素值
    17         for next in cur.nexts:          # 遍历元素的邻接节点
    18             if next not in nodeSet:     # 若邻接节点没有入过队,加入队列并登记
    19                 nodeSet.add(next)
    20                 queue.put(next)

    2.深度优先搜索

     1 # 图的深度优先遍历
     2 # 1.利用栈实现
     3 # 2.从源节点开始把节点按照深度放入栈,然后弹出
     4 # 3.每弹出一个点,把该节点下一个没有进过栈的邻接点放入栈
     5 # 4.直到栈变空
     6 def dfs(node):
     7     if node is None:
     8         return
     9     nodeSet = set()
    10     stack = []
    11     print(node.value)
    12     nodeSet.add(node)
    13     stack.append(node)
    14     while len(stack) > 0:
    15         cur = stack.pop()               # 弹出最近入栈的节点
    16         for next in cur.nexts:         # 遍历该节点的邻接节点
    17             if next not in nodeSet:    # 如果邻接节点不重复
    18                 stack.append(cur)       # 把节点压入
    19                 stack.append(next)      # 把邻接节点压入
    20                 set.add(next)           # 登记节点
    21                 print(next.value)       # 打印节点值
    22                 break                   # 退出,保持深度优先
  • 相关阅读:
    Rraspberry Pi 4B python3 安装opencv
    如何用arduion制作智能 垃圾桶
    MySQL(二)表结构的管理
    MySQL(一)基础操作
    vc++绘图基础
    网站签~
    (转)Oracle 知识日常积累
    利用反射判断bean属性不为空(null和空串)
    (转)Oracle 单字段拆分成多行
    svn 解决树冲突
  • 原文地址:https://www.cnblogs.com/icekx/p/9152452.html
Copyright © 2011-2022 走看看