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计算最大优先级队列实例
Dec 18 Python
Python2.x和3.x下maketrans与translate函数使用上的不同
Apr 13 Python
分析Python中解析构建数据知识
Jan 20 Python
python实现图片文件批量重命名
Mar 23 Python
对Python之gzip文件读写的方法详解
Feb 08 Python
Python基础之函数的定义与使用示例
Mar 23 Python
python查看数据类型的方法
Oct 12 Python
python3:excel操作之读取数据并返回字典 + 写入的案例
Sep 01 Python
windows系统Tensorflow2.x简单安装记录(图文)
Jan 18 Python
python爬取豆瓣电影排行榜(requests)的示例代码
Feb 18 Python
python opencv人脸识别考勤系统的完整源码
Apr 26 Python
python非标准时间的转换
Jul 25 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加密解密实用类分享
2014/01/07 PHP
[原创]PHP简单开启curl的方法(测试可行)
2016/01/11 PHP
php使用pear_smtp发送邮件
2016/04/15 PHP
PHP入门教程之自定义函数用法详解(创建,调用,变量,参数,返回值等)
2016/09/11 PHP
php进程daemon化的正确实现方法
2018/09/06 PHP
event对象的方法 兼容多浏览器
2009/06/27 Javascript
jquery ready(fn)事件使用介绍
2013/08/21 Javascript
多种方法实现load加载完成后把图片一次性显示出来
2014/02/19 Javascript
javascript实现简单的全选和反选功能
2016/01/05 Javascript
50 个 jQuery 插件可将你的网站带到另外一个高度
2016/04/26 Javascript
javascript 将共享属性迁移到原型中去的实现方法
2016/08/31 Javascript
JS验证不重复验证码
2017/02/10 Javascript
简单谈谈React中的路由系统
2017/07/25 Javascript
微信小程序实现滚动消息通知
2018/02/02 Javascript
详解从买域名到使用pm2部署node.js项目全过程
2018/03/07 Javascript
使用layer弹窗和layui表单实现新增功能
2018/08/09 Javascript
vue首次赋值不触发watch的解决方法
2018/09/11 Javascript
DWR内存兼容及无法调用问题解决方案
2020/10/16 Javascript
Python中文竖排显示的方法
2015/07/28 Python
Python程序中设置HTTP代理
2016/11/06 Python
python使用Apriori算法进行关联性解析
2017/12/21 Python
Python简单实现网页内容抓取功能示例
2018/06/07 Python
利用Python将每日一句定时推送至微信的实现方法
2018/08/13 Python
Python使用pandas和xlsxwriter读写xlsx文件的方法示例
2019/04/09 Python
详解python中的模块及包导入
2019/08/30 Python
Python 单例设计模式用法实例分析
2019/09/23 Python
解决pyPdf和pyPdf2在合并pdf时出现异常的问题
2020/04/03 Python
Python下载的11种姿势(小结)
2020/11/18 Python
五分钟学会HTML5的WebSocket协议
2019/11/22 HTML / CSS
怎么样写好简历中的自我评价
2013/10/25 职场文书
应届生妇产科护士求职信
2013/10/27 职场文书
迎新春趣味活动方案
2014/08/24 职场文书
2014年党员加强作风建设思想汇报
2014/09/15 职场文书
单位法定代表人授权委托书
2014/09/20 职场文书
Spring-cloud Config Server的3种配置方式
2021/09/25 Java/Android
基于PostgreSQL/openGauss 的分布式数据库解决方案
2021/12/06 PostgreSQL