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中利用生成器实现的并发编程
May 04 Python
Python读写txt文本文件的操作方法全解析
Jun 26 Python
Python基于回溯法子集树模板解决0-1背包问题实例
Sep 02 Python
利用Pandas读取文件路径或文件名称包含中文的csv文件方法
Jul 04 Python
Python生成指定数量的优惠码实操内容
Jun 18 Python
树莓派3 搭建 django 服务器的实例
Aug 29 Python
详细整理python 字符串(str)与列表(list)以及数组(array)之间的转换方法
Aug 30 Python
使用python计算三角形的斜边例子
Apr 15 Python
Python退出时强制运行一段代码的实现方法
Apr 29 Python
python 异步async库的使用说明
May 04 Python
Python如何将装饰器定义为类
Jul 30 Python
基于Python和openCV实现图像的全景拼接详细步骤
Oct 05 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
有关JSON以及JSON在PHP中的应用
2010/04/09 PHP
PHP使用星号替代用户名手机和邮箱的实现代码
2018/02/07 PHP
跨浏览器的 mouseenter mouseleave 以及 compareDocumentPosition的使用说明
2010/05/04 Javascript
javascript中的对象创建 实例附注释
2011/02/08 Javascript
JS焦点图切换,上下翻转
2011/05/12 Javascript
window.location.href IE下跳转失效的解决方法
2014/03/27 Javascript
node.js中的path.isAbsolute方法使用说明
2014/12/08 Javascript
jquery判断密码强度的验证代码
2020/04/22 Javascript
javascript实现添加附件功能的方法
2015/11/18 Javascript
解决jQuery使用JSONP时产生的错误
2015/12/02 Javascript
基于JQuery的$.ajax方法进行异步请求导致页面闪烁的解决办法
2016/05/10 Javascript
解决node.js安装包失败的几种方法
2016/09/02 Javascript
JS二叉树的简单实现方法示例
2017/04/05 Javascript
vue params、query传参使用详解
2017/09/12 Javascript
Vee-Validate的使用方法详解
2017/09/22 Javascript
jQuery实现的手动拖动控制进度条效果示例【测试可用】
2018/04/18 jQuery
angular4中引入echarts的方法示例
2019/01/29 Javascript
如何利用ES6进行Promise封装总结
2019/02/11 Javascript
JS重学系列之聊聊new操作符
2019/03/04 Javascript
[13:21]DOTA2国际邀请赛采访专栏:RSnake战队国士无双,Fnatic.Fly
2013/08/06 DOTA
用python读写excel的方法
2014/11/18 Python
Python获取当前公网ip并自动断开宽带连接实例代码
2018/01/12 Python
利用Python读取txt文档的方法讲解
2018/06/23 Python
vue学习笔记之动态组件和v-once指令简单示例
2020/02/29 Python
django orm模块中的 is_delete用法
2020/05/20 Python
Python实现加密接口测试方法步骤详解
2020/06/05 Python
socket.io 和canvas 实现的共享画板功能
2019/05/22 HTML / CSS
印尼穆斯林时尚购物网站:Hijabenka
2016/12/10 全球购物
菲律宾最大的网上花店和礼品店:PhilFlower.com
2018/02/09 全球购物
阿玛尼意大利官网:Armani意大利
2018/10/30 全球购物
幼儿园母亲节活动方案
2014/03/10 职场文书
学校食堂食品安全责任书
2014/07/28 职场文书
求职意向书
2014/07/29 职场文书
童年读书笔记
2015/06/26 职场文书
2016护理专业求职自荐书
2016/01/28 职场文书
Python数据可视化之绘制柱状图和条形图
2021/05/25 Python