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 29 Python
python获得两个数组交集、并集、差集的方法
Mar 27 Python
Python中用sleep()方法操作时间的教程
May 22 Python
Python中创建字典的几种方法总结(推荐)
Apr 27 Python
Python实现统计代码行的方法分析
Jul 12 Python
python中csv文件的若干读写方法小结
Jul 04 Python
详解Python logging调用Logger.info方法的处理过程
Feb 12 Python
python-opencv获取二值图像轮廓及中心点坐标的代码
Aug 27 Python
Python读写文件模式和文件对象方法实例详解
Sep 17 Python
Python性能分析工具Profile使用实例
Nov 19 Python
Pycharm 设置默认解释器路径和编码格式的操作
Feb 05 Python
Python爬虫基础之初次使用scrapy爬虫实例
Jun 26 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 应用程序的安全 -- 不能违反的四条安全规则
2006/11/26 PHP
发一个php简单的伪原创程序,配合商城采集用的
2010/10/12 PHP
PHP单例模式简单用法示例
2017/06/23 PHP
Laravel 5.5 的自定义验证对象/类示例代码详解
2017/08/29 PHP
imagettftext() 失效,不起作用
2021/03/09 PHP
URL地址中的#符号使用说明
2011/02/12 Javascript
给jqGrid数据行添加修改和删除操作链接(之一)
2011/11/04 Javascript
Uglifyjs(JS代码优化工具)入门 安装使用
2020/04/13 Javascript
javascript测试题练习代码
2012/10/10 Javascript
jquery中map函数与each函数的区别实例介绍
2014/06/23 Javascript
浅谈javascript中自定义模版
2015/01/29 Javascript
js实现精美的银灰色竖排折叠菜单
2015/05/16 Javascript
JavaScript中getUTCSeconds()方法的使用详解
2015/06/11 Javascript
js智能获取浏览器版本UA信息的方法
2016/08/08 Javascript
jquery版轮播图效果和extend扩展
2017/07/18 jQuery
浅谈vue项目优化之页面的按需加载(vue+webpack)
2017/12/11 Javascript
javascript实现循环广告条效果
2017/12/12 Javascript
实现高性能javascript的注意事项
2019/05/27 Javascript
vue.js购物车添加商品组件的方法
2019/09/17 Javascript
JavaScript HTML DOM 元素 (节点)新增,编辑,删除操作实例分析
2020/03/02 Javascript
JQuery事件冒泡和默认行为代码实例
2020/05/13 jQuery
jQuery+ajax实现文件上传功能
2020/12/22 jQuery
[01:11:10]2014 DOTA2华西杯精英邀请赛 5 24 iG VS VG加赛
2014/05/26 DOTA
python实现飞机大战
2018/09/11 Python
在Pycharm中使用GitHub的方法步骤
2019/06/13 Python
python实现知乎高颜值图片爬取
2019/08/12 Python
GNC健安喜官方海外旗舰店:美国著名保健品牌
2017/01/04 全球购物
TUMI香港官网:国际领先的行李箱、背囊品牌
2021/03/01 全球购物
环境工程求职简历的自我评价范文
2013/10/24 职场文书
《十六年前的回忆》教学反思
2014/02/14 职场文书
五年后的职业生涯规划
2014/03/04 职场文书
竞聘书格式及范文
2014/03/31 职场文书
留学推荐信范文
2014/05/10 职场文书
《没有任何借口》读后感:完美的执行能力
2020/01/07 职场文书
linux下导入、导出mysql数据库命令的实现方法
2021/05/26 MySQL
CSS实现隐藏搜索框功能(动画正反向序列)
2021/07/21 HTML / CSS