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 相关文章推荐
ssh批量登录并执行命令的python实现代码
May 25 Python
Pyhton中单行和多行注释的使用方法及规范
Oct 11 Python
rabbitmq(中间消息代理)在python中的使用详解
Dec 14 Python
Python语言描述机器学习之Logistic回归算法
Dec 21 Python
Python实现霍夫圆和椭圆变换代码详解
Jan 12 Python
Python 实现选择排序的算法步骤
Apr 22 Python
Python操作mongodb数据库进行模糊查询操作示例
Jun 09 Python
python中reader的next用法
Jul 24 Python
python实现Excel文件转换为TXT文件
Apr 28 Python
[机器视觉]使用python自动识别验证码详解
May 16 Python
Macbook安装Python最新版本、GUI开发环境、图像处理、视频处理环境详解
Feb 17 Python
Python实现迪杰斯特拉算法并生成最短路径的示例代码
Dec 01 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 HTML代码串 截取实现代码
2009/06/29 PHP
php将字符串随机分割成不同长度数组的方法
2015/06/01 PHP
PHP中你应该知道的require()文件包含的正确用法
2015/06/12 PHP
javascript写的简单的计算器,内容很多,方法实用,推荐
2011/12/29 Javascript
用js判断页面刷新或关闭的方法(onbeforeunload与onunload事件)
2012/06/22 Javascript
window.open不被拦截的实现代码
2012/08/22 Javascript
js数组的操作详解
2013/03/27 Javascript
js使用removeChild方法动态删除div元素
2014/08/01 Javascript
javascript面向对象程序设计(一)
2015/01/29 Javascript
javascript实现PC网页里的拖拽效果
2016/03/14 Javascript
js实现select二级联动下拉菜单
2020/04/17 Javascript
jQuery实现加入收藏夹功能(主流浏览器兼职)
2016/12/24 Javascript
js正则表达式惰性匹配和贪婪匹配用法分析
2016/12/26 Javascript
addeventlistener监听scroll跟touch(实例讲解)
2017/08/04 Javascript
自适应布局meta标签中viewport、content、width、initial-scale、minimum-scale、maximum-scale总结
2017/08/18 Javascript
浅谈react-native热更新react-native-pushy集成遇到的问题
2017/09/30 Javascript
JS实现中文汉字按拼音排序的方法
2017/10/09 Javascript
React Hooks的深入理解与使用
2018/11/12 Javascript
Angular实现svg和png图片下载实现
2019/05/05 Javascript
JavaScript静态作用域和动态作用域实例详解
2019/06/17 Javascript
简单了解小程序+node梳理登陆流程
2019/06/24 Javascript
layui禁用侧边导航栏点击事件的解决方法
2019/09/25 Javascript
Vue混入mixins滚动触底的方法
2019/11/22 Javascript
[51:06]2018DOTA2亚洲邀请赛3月29日 小组赛A组 KG VS Liquid
2018/03/30 DOTA
python用字典统计单词或汉字词个数示例
2014/04/22 Python
python实现数值积分的Simpson方法实例分析
2015/06/05 Python
Python实现TCP协议下的端口映射功能的脚本程序示例
2016/06/14 Python
python通过百度地图API获取某地址的经纬度详解
2018/01/28 Python
实用自动化运维Python脚本分享
2018/06/04 Python
Django 视图层(view)的使用
2018/11/09 Python
django做form表单的数据验证过程详解
2019/07/26 Python
Haglöfs瑞典官方网站:haglofs火柴棍,欧洲顶级户外品牌
2018/10/18 全球购物
2014年预备党员群众路线教育实践活动对照检查材料思想汇报
2014/10/02 职场文书
2015年语文教师工作总结
2015/05/25 职场文书
Pytorch中Softmax和LogSoftmax的使用详解
2021/06/05 Python
CSS元素定位之通过元素的标签或者元素的id、class属性定位详解
2022/09/23 HTML / CSS