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 相关文章推荐
linux系统使用python获取内存使用信息脚本分享
Jan 15 Python
用Python给文本创立向量空间模型的教程
Apr 23 Python
python做量化投资系列之比特币初始配置
Jan 23 Python
用 Python 连接 MySQL 的几种方式详解
Apr 04 Python
python opencv 读取本地视频文件 修改ffmpeg的方法
Jan 26 Python
解决Pycharm调用Turtle时 窗口一闪而过的问题
Feb 16 Python
谈一谈基于python的面向对象编程基础
May 21 Python
使用django的objects.filter()方法匹配多个关键字的方法
Jul 18 Python
python sorted函数原理解析及练习
Feb 10 Python
python Plotly绘图工具的简单使用
Mar 03 Python
使用python实现微信小程序自动签到功能
Apr 27 Python
Python中socket网络通信是干嘛的
May 27 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/11/10 PHP
php使用Jpgraph绘制复杂X-Y坐标图的方法
2015/06/10 PHP
PHP count_chars()函数讲解
2019/02/14 PHP
toggle()隐藏问题的解决方法
2014/02/17 Javascript
js中数组结合字符串实现查找(屏蔽广告判断url等)
2016/03/30 Javascript
解决vue build打包之后首页白屏的问题
2018/03/06 Javascript
使用vscode快速建立vue模板过程详解
2019/10/10 Javascript
vuex 实现getter值赋值给vue组件里的data示例
2019/11/05 Javascript
element实现合并单元格通用方法
2019/11/13 Javascript
Vue实现简单计算器案例
2020/02/25 Javascript
Vue项目中使用mock.js的完整步骤
2021/01/12 Vue.js
k8s node节点重新加入master集群的实现
2021/02/22 Javascript
[02:38]DOTA2英雄基础教程 噬魂鬼
2014/01/03 DOTA
[01:01:04]2018DOTA2亚洲邀请赛 4.5 淘汰赛 OpTic vs TNC 第一场
2018/04/06 DOTA
使用Python进行新浪微博的mid和url互相转换实例(10进制和62进制互算)
2014/04/25 Python
Python的Django框架中if标签的相关使用
2015/07/15 Python
python+pyqt实现右下角弹出框
2017/10/26 Python
浅谈python函数之作用域(python3.5)
2017/10/27 Python
django实现用户登陆功能详解
2017/12/11 Python
Python批量启动多线程代码实例
2020/02/18 Python
keras实现theano和tensorflow训练的模型相互转换
2020/06/19 Python
浅谈keras中Dropout在预测过程中是否仍要起作用
2020/07/09 Python
python 实现表情识别
2020/11/21 Python
纯CSS3制作的鼠标悬停时边框旋转
2017/01/03 HTML / CSS
美国男士西装打折店:Jos. A. Bank
2017/11/13 全球购物
英国门把手公司:Door Handle Company
2019/05/12 全球购物
Berghaus官网:户外服装和设备,防水服
2020/01/17 全球购物
灵泰克Java笔试题
2016/01/09 面试题
中医临床专业自我鉴定范文
2014/01/15 职场文书
春节活动策划方案
2014/01/24 职场文书
小学庆六一活动方案
2014/02/28 职场文书
企业金融服务方案
2014/06/03 职场文书
网络文明传播志愿者活动方案
2014/08/20 职场文书
房屋买卖协议样本
2014/11/16 职场文书
2014年保育员工作总结
2014/12/02 职场文书
2019大学生暑期实习心得总结
2019/08/21 职场文书