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中endswith()函数的基本使用
Apr 07 Python
python使用range函数计算一组数和的方法
May 07 Python
实例Python处理XML文件的方法
Aug 31 Python
Python自动化测试Eclipse+Pydev 搭建开发环境
Aug 15 Python
对Python之gzip文件读写的方法详解
Feb 08 Python
在PyTorch中Tensor的查找和筛选例子
Aug 18 Python
Python产生一个数值范围内的不重复的随机数的实现方法
Aug 21 Python
Python3 shutil(高级文件操作模块)实例用法总结
Feb 19 Python
Python操作Excel把数据分给sheet
May 20 Python
Django实现文章详情页面跳转代码实例
Sep 16 Python
如何利用python生成MD5并去重
Dec 07 Python
分享3个非常实用的 Python 模块
Mar 03 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数组函数序列之array_unique() - 去除数组中重复的元素值
2011/10/29 PHP
php字符串截取的简单方法
2013/07/04 PHP
PHP的Yii框架中使用数据库的配置和SQL操作实例教程
2016/03/17 PHP
Laravel5.5 实现后台管理登录的方法(自定义用户表登录)
2019/09/30 PHP
laravel框架与其他框架的详细对比
2019/10/23 PHP
javascript下过滤数组重复值的代码
2007/09/10 Javascript
有关js的变量作用域和this指针的讨论
2010/12/16 Javascript
JQuery入门——移除绑定事件unbind方法概述及应用
2013/02/05 Javascript
js实现div的切换特效上一个下一个
2014/02/11 Javascript
基于jQuery.Hz2Py.js插件实现的汉字转拼音特效
2015/05/07 Javascript
js获取所有checkbox的值的简单实例
2016/05/30 Javascript
jQuery EasyUI基础教程之EasyUI常用组件(推荐)
2016/07/15 Javascript
layui导出所有数据的例子
2019/09/10 Javascript
原生js实现ajax请求和JSONP跨域请求操作示例
2020/03/14 Javascript
python编写暴力破解FTP密码小工具
2014/11/19 Python
python编程嵌套函数实例代码
2018/02/11 Python
Python反爬虫技术之防止IP地址被封杀的讲解
2019/01/09 Python
Python字典中的值为列表或字典的构造实例
2019/12/16 Python
python无序链表删除重复项的方法
2020/01/17 Python
python3中sys.argv的实例用法
2020/04/24 Python
python相对企业语言优势在哪
2020/06/12 Python
纯HTML5+CSS3制作图片旋转
2016/01/12 HTML / CSS
html5 canvas实现给图片添加平铺水印
2019/08/20 HTML / CSS
Paradox London官方网站:英国新娘鞋婚礼鞋品牌
2019/08/29 全球购物
捷克母婴用品购物网站:Feedo.cz
2020/12/28 全球购物
启动一个线程是用run()还是start()
2016/12/25 面试题
企业厂长岗位职责
2013/12/17 职场文书
六一节目主持词
2014/04/01 职场文书
爱心捐款倡议书
2014/04/14 职场文书
宣传口号大全
2014/06/16 职场文书
大学英语专业求职信
2014/06/21 职场文书
简单租房协议书范本
2014/08/20 职场文书
盗窃案辩护词
2015/05/21 职场文书
风之谷观后感
2015/06/11 职场文书
古诗文之爱国名句(77句)
2019/09/24 职场文书
Python基础之元编程知识总结
2021/05/23 Python