python图的深度优先和广度优先算法实例分析


Posted in Python onOctober 26, 2019

本文实例讲述了python图的深度优先和广度优先算法。分享给大家供大家参考,具体如下:

首先有一个概念:回溯

回溯法(探索与回溯法)是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。

深度优先算法:

(1)访问初始顶点v并标记顶点v已访问。
(2)查找顶点v的第一个邻接顶点w。
(3)若顶点v的邻接顶点w存在,则继续执行;否则回溯到v,再找v的另外一个未访问过的邻接点。
(4)若顶点w尚未被访问,则访问顶点w并标记顶点w为已访问。
(5)继续查找顶点w的下一个邻接顶点wi,如果v取值wi转到步骤(3)。直到连通图中所有顶点全部访问过为止。

广度优先算法:

(1)顶点v入队列。
(2)当队列非空时则继续执行,否则算法结束。
(3)出队列取得队头顶点v;访问顶点v并标记顶点v已被访问。
(4)查找顶点v的第一个邻接顶点col。
(5)若v的邻接顶点col未被访问过的,则col入队列。
(6)继续查找顶点v的另一个新的邻接顶点col,转到步骤(5)。直到顶点v的所有未被访问过的邻接点处理完。转到步骤(2)。

代码:

#!/usr/bin/python
# -*- coding: utf-8 -*-
class Graph(object):
  def __init__(self,*args,**kwargs):
    self.node_neighbors = {}
    self.visited = {}
  def add_nodes(self,nodelist):
    for node in nodelist:
      self.add_node(node)
  def add_node(self,node):
    if not node in self.nodes():
      self.node_neighbors[node] = []
  def add_edge(self,edge):
    u,v = edge
    if(v not in self.node_neighbors[u]) and ( u not in self.node_neighbors[v]):
      self.node_neighbors[u].append(v)
      if(u!=v):
        self.node_neighbors[v].append(u)
  def nodes(self):
    return self.node_neighbors.keys()
  def depth_first_search(self,root=None):
    order = []
    def dfs(node):
      self.visited[node] = True
      order.append(node)
      for n in self.node_neighbors[node]:
        if not n in self.visited:
          dfs(n)
    if root:
      dfs(root)
    for node in self.nodes():
      if not node in self.visited:
        dfs(node)
    print order
    return order
  def breadth_first_search(self,root=None):
    queue = []
    order = []
    def bfs():
      while len(queue)> 0:
        node = queue.pop(0)
        self.visited[node] = True
        for n in self.node_neighbors[node]:
          if (not n in self.visited) and (not n in queue):
            queue.append(n)
            order.append(n)
    if root:
      queue.append(root)
      order.append(root)
      bfs()
    for node in self.nodes():
      if not node in self.visited:
        queue.append(node)
        order.append(node)
        bfs()
    print order
    return order
if __name__ == '__main__':
  g = Graph()
g.add_nodes([i+1 for i in range(8)])
g.add_edge((1, 2))
g.add_edge((1, 3))
g.add_edge((2, 4))
g.add_edge((2, 5))
g.add_edge((4, 8))
g.add_edge((5, 8))
g.add_edge((3, 6))
g.add_edge((3, 7))
g.add_edge((6, 7))
print "nodes:", g.nodes()
order = g.breadth_first_search(1)
order = g.depth_first_search(1)

结果:

nodes: [1, 2, 3, 4, 5, 6, 7, 8]

广度优先:
[1, 2, 3, 4, 5, 6, 7, 8]

深度优先:

[1, 2, 4, 8, 5, 3, 6, 7]

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

Python 相关文章推荐
python文件和目录操作方法大全(含实例)
Mar 12 Python
基于Python实现的百度贴吧网络爬虫实例
Apr 17 Python
详解常用查找数据结构及算法(Python实现)
Dec 09 Python
Java及python正则表达式详解
Dec 27 Python
python绘制漏斗图步骤详解
Mar 04 Python
详解python执行shell脚本创建用户及相关操作
Apr 11 Python
python Django编写接口并用Jmeter测试的方法
Jul 31 Python
python Django里CSRF 对应策略详解
Aug 05 Python
运用PyTorch动手搭建一个共享单车预测器
Aug 06 Python
最新2019Pycharm安装教程 亲测
Feb 28 Python
高考考python编程是真的吗
Jul 20 Python
详解python的变量缓存机制
Jan 24 Python
python单例模式原理与创建方法实例分析
Oct 26 #Python
Python aiohttp百万并发极限测试实例分析
Oct 26 #Python
python实现淘宝购物系统
Oct 25 #Python
DJANGO-URL反向解析REVERSE实例讲解
Oct 25 #Python
python计算n的阶乘的方法代码
Oct 25 #Python
Python OrderedDict的使用案例解析
Oct 25 #Python
python编写计算器功能
Oct 25 #Python
You might like
PHP has encountered an Access Violation at 7C94BD02解决方法
2009/08/24 PHP
php下将多个数组合并成一个数组的方法与实例代码
2011/02/03 PHP
php生成动态验证码gif图片
2015/10/19 PHP
PHP创建/删除/复制文件夹、文件
2016/05/03 PHP
php获取用户真实IP和防刷机制的实例代码
2018/11/28 PHP
PHP如何解决微信文章图片防盗链
2020/12/09 PHP
颜色选择器 Color Picker,IE,Firefox,Opera,Safar
2010/11/25 Javascript
JavaScript中Number.MIN_VALUE属性的使用示例
2015/06/04 Javascript
js实现select跳转菜单新窗口效果代码分享(超简单)
2015/08/21 Javascript
基于jQuery实现的幻灯图片切换
2016/12/02 Javascript
ES6字符串模板,剩余参数,默认参数功能与用法示例
2017/04/06 Javascript
axios进阶实践之利用最优雅的方式写ajax请求
2017/12/20 Javascript
react-native动态切换tab组件的方法
2018/07/07 Javascript
学习jQuery中的noConflict()用法
2018/09/28 jQuery
vue如何实现自定义底部菜单栏
2019/07/01 Javascript
js实现小球在页面规定的区域运动
2020/06/16 Javascript
纯js+css实现在线时钟
2020/08/18 Javascript
[49:05]OG vs Newbee 2019DOTA2国际邀请赛淘汰赛 胜者组 BO3 第二场 8.21.mp4
2020/07/19 DOTA
Python datetime时间格式化去掉前导0
2014/07/31 Python
Python常用的爬虫技巧总结
2016/03/28 Python
Python基础教程之浅拷贝和深拷贝实例详解
2017/07/15 Python
python回调函数中使用多线程的方法
2017/12/25 Python
Python 实现引用其他.py文件中的类和类的方法
2018/04/29 Python
flask-restful使用总结
2018/12/04 Python
Python3.5 Pandas模块缺失值处理和层次索引实例详解
2019/04/23 Python
使用python 写一个静态服务(实战)
2019/06/28 Python
Flask-SocketIO服务端安装及使用代码示例
2020/11/26 Python
CSS3实现瀑布流布局与无限加载图片相册的实例代码
2016/12/22 HTML / CSS
世嘉游戏英国官方商店:SEGA Shop UK
2019/09/20 全球购物
指导教师评语
2014/04/26 职场文书
校庆标语集锦
2014/06/25 职场文书
仲裁协议书
2014/09/26 职场文书
2015年幼儿园班主任个人工作总结
2015/10/22 职场文书
LayUI+Shiro实现动态菜单并记住菜单收展的示例
2021/05/06 Javascript
Java多条件判断场景中规则执行器的设计
2021/06/26 Java/Android
python计算列表元素与乘积详情
2022/08/05 Python