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实现发送email的几种常用方法
Aug 18 Python
python通过正则查找微博@(at)用户的方法
Mar 13 Python
Python与Java间Socket通信实例代码
Mar 06 Python
Python中存取文件的4种不同操作
Jul 02 Python
基于python历史天气采集的分析
Feb 14 Python
Python3字符串encode与decode的讲解
Apr 02 Python
Python CVXOPT模块安装及使用解析
Aug 01 Python
mac使用python识别图形验证码功能
Jan 10 Python
python将logging模块封装成单独模块并实现动态切换Level方式
May 12 Python
python开发入门——列表生成式
Sep 03 Python
Python实现灰色关联分析与结果可视化的详细代码
Mar 25 Python
Python 操作pdf pdfplumber读取PDF写入Exce
Aug 14 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
Swoole-1.7.22 版本已发布,修复PHP7相关问题
2015/12/31 PHP
php统计数组不同元素的个数的实例方法
2019/09/26 PHP
为JS扩展Array.prototype.indexOf引发的问题探讨及解决
2013/04/24 Javascript
Javascript无阻塞加载具体方式
2013/06/28 Javascript
js 弹出框只弹一次(二次修改之后的)
2013/11/26 Javascript
使用nodejs、Python写的一个简易HTTP静态文件服务器
2014/07/18 NodeJs
JavaScript获取网页、浏览器、屏幕高度和宽度汇总
2014/12/18 Javascript
深入理解jquery中extend的实现
2016/12/22 Javascript
轻松理解JavaScript之AJAX
2017/03/15 Javascript
Angular实现较为复杂的表格过滤,删除功能示例
2017/12/23 Javascript
浅析Node.js非对称加密方法
2018/01/29 Javascript
JS加密插件CryptoJS实现的Base64加密示例
2020/08/16 Javascript
对angularJs中2种自定义服务的实例讲解
2018/09/30 Javascript
vue+Element实现搜索关键字高亮功能
2019/05/28 Javascript
[02:22]《新闻直播间》2017年08月14日
2017/08/15 DOTA
详解Django中的ifequal和ifnotequal标签使用
2015/07/16 Python
python学习之编写查询ip程序
2016/02/27 Python
Python探索之静态方法和类方法的区别详解
2017/10/27 Python
python进行两个表格对比的方法
2018/06/27 Python
python实现反转部分单向链表
2018/09/27 Python
python DataFrame 取差集实例
2019/01/30 Python
pybind11在Windows下的使用教程
2019/07/04 Python
Python 中判断列表是否为空的方法
2019/11/24 Python
tensorflow2.0保存和恢复模型3种方法
2020/02/03 Python
Numpy 理解ndarray对象的示例代码
2020/04/03 Python
Python中无限循环需要什么条件
2020/05/27 Python
Pycharm打开已有项目配置python环境的方法
2020/07/03 Python
python 实现数据库中数据添加、查询与更新的示例代码
2020/12/07 Python
纯CSS3实现扇形动画菜单(简化版)实例源码
2017/01/17 HTML / CSS
远程学习的教学用品和家庭学习资源:Really Good Stuff
2020/04/27 全球购物
华为C++笔试题
2014/08/05 面试题
爽歪歪广告词
2014/03/20 职场文书
大学生社会实践自我鉴定
2014/03/24 职场文书
2014年教师业务学习材料
2014/05/12 职场文书
法制教育演讲稿
2014/09/10 职场文书
Python中Matplotlib的点、线形状、颜色以及绘制散点图
2022/04/07 Python