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中的字符串替换操作示例
Jun 27 Python
selenium+python设置爬虫代理IP的方法
Nov 29 Python
对pytorch网络层结构的数组化详解
Dec 08 Python
python实现定时发送qq消息
Jan 18 Python
Python3.6.x中内置函数总结及讲解
Feb 22 Python
python获取微信企业号打卡数据并生成windows计划任务
Apr 30 Python
详解python中的线程与线程池
May 10 Python
python基础 range的用法解析
Aug 23 Python
Jupyter加载文件的实现方法
Apr 14 Python
PyInstaller运行原理及常用操作详解
Jun 13 Python
python opencv实现简易画图板
Aug 27 Python
用python监控服务器的cpu,磁盘空间,内存,超过邮件报警
Jan 29 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
30 个很棒的PHP开源CMS内容管理系统小结
2011/10/14 PHP
ThinkPHP的RBAC(基于角色权限控制)深入解析
2013/06/17 PHP
php常用Stream函数集介绍
2013/06/24 PHP
php 获取页面中指定内容的实现类
2014/01/23 PHP
PHP实现批量删除(封装)
2017/04/28 PHP
PHP 中 var_export、print_r、var_dump 调试中的区别
2018/06/19 PHP
Yii2 queue的队列使用详解
2019/07/19 PHP
Javascript this 的一些学习总结
2012/08/02 Javascript
浅谈JavaScript之事件绑定
2013/07/08 Javascript
JS模拟自动点击的简单实例
2013/08/08 Javascript
js日期相关函数总结分享
2013/10/15 Javascript
DOM 高级编程
2015/05/06 Javascript
javaScript中with函数用法实例分析
2015/06/08 Javascript
再谈javascript注入 黑客必备!
2016/09/14 Javascript
微信小程序页面传值实例分析
2017/04/19 Javascript
js 将canvas生成图片保存,或直接保存一张图片的实现方法
2018/01/02 Javascript
详解为生产环境编译Angular2应用的方法
2018/12/10 Javascript
pytorch permute维度转换方法
2018/12/14 Python
详解python selenium 爬取网易云音乐歌单名
2019/03/28 Python
django-filter和普通查询的例子
2019/08/12 Python
Python命令行click参数用法解析
2019/12/19 Python
基于SQLAlchemy实现操作MySQL并执行原生sql语句
2020/06/10 Python
python json.dumps() json.dump()的区别详解
2020/07/14 Python
python 视频下载神器(you-get)的具体使用
2021/01/06 Python
Python+Appium实现自动化清理微信僵尸好友的方法
2021/02/04 Python
纯CSS3实现图片无间断轮播效果
2016/08/25 HTML / CSS
迪卡侬荷兰官网:Decathlon荷兰
2017/10/29 全球购物
西班牙电子产品购物网站:Electronicamente
2018/07/26 全球购物
清洁工岗位职责
2014/01/29 职场文书
《苏珊的帽子》教学反思
2014/04/07 职场文书
2015毕业寄语大全
2015/02/26 职场文书
党支部培养考察意见
2015/06/02 职场文书
黑白记忆观后感
2015/06/18 职场文书
运动会宣传稿50字
2015/07/23 职场文书
励志语录:你若不勇敢,谁替你坚强
2019/11/08 职场文书
如何解决flex文本溢出问题小结
2022/07/15 HTML / CSS