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文件读写并使用mysql批量插入示例分享(python操作mysql)
Feb 17 Python
Python BeautifulSoup中文乱码问题的2种解决方法
Apr 22 Python
从零学Python之入门(三)序列
May 25 Python
Python脚本在Appium库上对移动应用实现自动化测试
Apr 17 Python
Django数据库操作的实例(增删改查)
Sep 04 Python
Python2/3中urllib库的一些常见用法
Dec 19 Python
windows下添加Python环境变量的方法汇总
May 14 Python
python Django中models进行模糊查询的示例
Jul 18 Python
Python列表(list)所有元素的同一操作解析
Aug 01 Python
python:删除离群值操作(每一行为一类数据)
Jun 08 Python
Python调用jar包方法实现过程解析
Aug 11 Python
Python利用FlashText算法实现替换字符串
Mar 31 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取整数函数常用的四种方法小结
2012/07/05 PHP
php反射应用示例
2014/02/25 PHP
PHP三元运算的2种写法代码实例
2014/05/12 PHP
php+redis消息队列实现抢购功能
2018/02/08 PHP
Laravel框架实现model层的增删改查(CURD)操作示例
2018/05/12 PHP
lib.utf.js
2007/08/21 Javascript
简单的前端js+ajax 购物车框架(入门篇)
2011/10/29 Javascript
AngularJS 整理一些优化的小技巧
2016/08/18 Javascript
Vue Element 分组+多选+可搜索Select选择器实现示例
2018/07/23 Javascript
JavaScript制作3D旋转相册
2020/08/02 Javascript
微信小程序利用button控制条件标签的变量问题
2020/03/15 Javascript
JS数组的常用10种方法详解
2020/05/08 Javascript
JS this关键字在ajax中使用出现问题解决方案
2020/07/17 Javascript
[05:20]卡尔工作室_DOTA2新手教学_DOTA2超强新手功能
2013/04/22 DOTA
[01:04:09]DOTA2-DPC中国联赛 正赛 iG vs VG BO3 第二场 2月2日
2021/03/11 DOTA
Python 字符串操作实现代码(截取/替换/查找/分割)
2013/06/08 Python
初学Python实用技巧两则
2014/08/29 Python
Python采用Django制作简易的知乎日报API
2016/08/03 Python
python ftp 按目录结构上传下载的实现代码
2018/09/12 Python
Python实现的矩阵转置与矩阵相乘运算示例
2019/03/26 Python
python实现beta分布概率密度函数的方法
2019/07/08 Python
对python 中re.sub,replace(),strip()的区别详解
2019/07/22 Python
python2和python3应该学哪个(python3.6与python3.7的选择)
2019/10/01 Python
python实现网页录音效果
2020/10/26 Python
老生常谈CSS中的长度单位
2016/06/27 HTML / CSS
Java如何支持I18N?
2016/10/31 面试题
餐厅销售主管职责范本
2014/02/19 职场文书
教室布置标语
2014/06/26 职场文书
2014医学院领导干部四风对照检查材料思想汇报
2014/09/16 职场文书
2015年预防青少年违法犯罪工作总结
2015/05/22 职场文书
pycharm2021激活码使用教程(永久激活亲测可用)
2021/03/30 Python
golang 实现时间戳和时间的转化
2021/05/07 Golang
如何更改Win11声音输出设备?Win11声音输出设备四种更改方法
2022/04/08 数码科技
vue打包时去掉所有的console.log
2022/04/10 Vue.js
git中cherry-pick命令的使用教程
2022/06/25 Servers
Go语言怎么使用变长参数函数
2022/07/15 Golang