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 相关文章推荐
用pywin32实现windows模拟鼠标及键盘动作
Apr 22 Python
Python之PyUnit单元测试实例
Oct 11 Python
python执行外部程序的常用方法小结
Mar 21 Python
基于python 二维数组及画图的实例详解
Apr 03 Python
python使用adbapi实现MySQL数据库的异步存储
Mar 19 Python
Python字符串对象实现原理详解
Jul 01 Python
django admin 自定义替换change页面模板的方法
Aug 23 Python
关于Python3 lambda函数的深入浅出
Nov 27 Python
Python实现搜索算法的实例代码
Jan 02 Python
Tkinter中复选菜单是否被选中的判断与设置方式
Mar 04 Python
对Matlab中共轭、转置和共轭装置的区别说明
May 11 Python
解决Python 函数声明先后顺序出现的问题
Sep 02 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
基于PHPExcel的常用方法总结
2013/06/13 PHP
ThinkPHP中的create方法与自动令牌验证实例教程
2014/08/22 PHP
php使用curl出现Expect:100-continue解决方法
2015/03/03 PHP
PHP实现文件上传与下载实例与总结
2016/03/13 PHP
php扩展开发入门demo示例
2019/09/23 PHP
前淘宝前端开发工程师阿当的PPT中有JS技术理念问题
2010/01/15 Javascript
解析jQuery与其它js(Prototype)库兼容共存
2013/07/04 Javascript
js用正则表达式来验证表单(比较齐全的资源)
2013/11/17 Javascript
类似php的js数组的in_array函数自定义方法
2013/12/27 Javascript
JQuery 图片滚动轮播示例代码
2014/03/24 Javascript
javascript实现的右下角弹窗实例
2015/04/24 Javascript
javascript实现连续赋值
2015/08/10 Javascript
jQuery实现点击后标记当前菜单位置(背景高亮菜单)效果
2015/08/22 Javascript
jQuery基于cookie实现的购物车实例分析
2015/12/24 Javascript
JS功能代码集锦
2016/05/04 Javascript
jQuery 选择器(61种)整理总结
2016/09/26 Javascript
使用 Javascript 实现浏览器推送提醒功能的示例
2017/11/03 Javascript
微信小程序App生命周期详解
2018/01/31 Javascript
angular 实现的输入框数字千分位及保留几位小数点功能示例
2018/06/19 Javascript
vue实现文字横向无缝走马灯组件效果的实例代码
2019/04/09 Javascript
原生JS无缝滑动轮播图
2019/10/22 Javascript
python实现端口转发器的方法
2015/03/13 Python
Python字符串和文件操作常用函数分析
2015/04/08 Python
python实现人人自动回复、抢沙发功能
2018/06/08 Python
用Python编写一个简单的CS架构后门的方法
2018/11/20 Python
详解numpy.meshgrid()方法使用
2019/08/01 Python
Python如何把多个PDF文件合并代码实例
2020/02/13 Python
Python tkinter布局与按钮间距设置方式
2020/03/04 Python
scrapy结合selenium解析动态页面的实现
2020/09/28 Python
pymysql模块使用简介与示例
2020/11/17 Python
《草虫的村落》教学反思
2014/02/16 职场文书
公司领导班子对照检查存在问题整改措施
2014/10/02 职场文书
教师廉洁自律个人总结
2015/02/10 职场文书
安徽导游词
2015/02/12 职场文书
读《茶花女》有感:山茶花的盛开与凋零
2020/01/17 职场文书
浅析JavaScript中的变量提升
2022/06/01 Javascript