本文实例讲述了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数据结构之图深度优先和广度优先实例详解相关推荐

  1. python2.7除法_对python中的float除法和整除法的实例详解

    从python2.2开始,便有两种除法运算符:"/"."//".两者最大区别在: python2.2前的版本和python2.2以后3.0以前的版本的默认情况下 ...

  2. python代码覆盖率测试_unittest+coverage单元测试代码覆盖操作实例详解_python

    这篇文章主要为大家详细介绍了unittest+coverage单元测试代码覆盖操作的实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 基于上一篇文章,这篇文章是关于使用coverage来实现代码 ...

  3. python生成表格文件_python 读取excel文件生成sql文件实例详解

    python 读取excel文件生成sql文件实例详解 学了python这么久,总算是在工作中用到一次.这次是为了从excel文件中读取数据然后写入到数据库中.这个逻辑用java来写的话就太重了,所以 ...

  4. python爬虫beautifulsoup爬当当网_Python爬虫包 BeautifulSoup 递归抓取实例详解_python_脚本之家...

    Python爬虫包 BeautifulSoup  递归抓取实例详解 概要: 爬虫的主要目的就是为了沿着网络抓取需要的内容.它们的本质是一种递归的过程.它们首先需要获得网页的内容,然后分析页面内容并找到 ...

  5. python之33个关键字详解_Python解析、提取url关键字的实例详解

    解析url用的类库: python2版本: from urlparse import urlparse import urllib python3版本: from urllib.parse impor ...

  6. python中类的构成_Python中类型关系和继承关系实例详解

    本文详细介绍了Python中类型关系和继承关系.分享给大家供大家参考.具体分析如下: 如果一个对象A持有另一个对象B的ID,那么检索到A之后就可以检索到B,我们就说存在一个A到B的导航.这种导航关系使 ...

  7. python 元组拆包_Python元组拆包和具名元组解析实例详解

    前言 在Python中元组是一个相较于其他语言比较特别的一个内置序列类型.有些python入门教程把元组成为"不可变的列表",这种说法是不完备的,其并没有完整的概括元组的特点.除了 ...

  8. python比例图_python在地图上画比例的实例详解

    现在用python画图已经难不倒一直跟小编学习的小伙伴们了,甚至有的小伙伴画图比小编还要厉害.为此小编还偷偷下了一番功夫,画图这种事情,细节上的完善肯定能让图片更加好看.所以小编知道大家会画地图,但是 ...

  9. python队列怎么用_Python队列的定义与使用方法实例详解

    这篇文章主要介绍了Python队列的定义与使用方法,结合具体实例形式分析了Python定义及使用队列的具体操作技巧与注意事项,需要的朋友可以参考下 本文实例讲述了Python队列的定义与使用方法.分享 ...

最新文章

  1. Cell子刊:微生物组学研究的突破与瓶颈
  2. No resource identifier found for attribute 'showAsAction' in package 'android'
  3. 利用开区间覆盖的约简给出$\bf{Lindelöf}$覆盖定理的一个新证明
  4. PAT甲级1112 Stucked Keyboard:[C++题解]卡住的键盘、双指针、去重
  5. qt使用 QMediaPlay 简单播放音乐
  6. HDU-5249 KPI(STL or 权值线段树)
  7. oracle连接外部数据库_使用Oracle验证外部数据
  8. CV Code | 本周新出计算机视觉开源代码汇总(语义分割、目标检测、超分辨率、网络结构设计、训练策略等)...
  9. 什么是网络计算机有什么优点,ISDN是什么?它有什么优点?
  10. java 生成不重复随机数_Java如何实现生成n个不重复的随机数 Java实现生成n个不重复的随机数代码...
  11. Window 通过cmd查看端口占用、相应进程、杀死进程等的命令
  12. 2019-2020-1 20175313 《信息安全系统设计基础》第二周学习总结
  13. 主函数是c语言的入口,代码逆向(一)——寻找main函数入口
  14. 凸优化第五章对偶 5.5最优性条件
  15. Ubuntu系统安装 - 单系统
  16. ws2812b灯带容易坏_树莓派控制WS2812B灯带 - Python
  17. Python:给信号添加白噪声
  18. http请求 405错误 方法不被允许 (Method not allowed)
  19. 求解一个约束优化问题
  20. python安装方法3.8.2_Python 3.8.2详细图文安装教程(附安装包) | 我爱分享网

热门文章

  1. 六年打磨!阿里开源混沌工程工具 ChaosBlade
  2. 启明星辰集团DT总部落地杭州 数据绿洲版图驱动未来发展
  3. 缓存和数据库一致性问题,看这篇就够了
  4. 在存储器的层次结构里,谁最快,谁最贵,谁最大?
  5. 腾讯视频云支持超300万场次直播带货 助力企业一天搭建直播间
  6. OpenStack入门科普,看这一篇就够啦!
  7. latex导数_Latex:导数【高中常用公式】
  8. idea 编辑区设置
  9. 解决Windows中PLSQL连接虚拟机中Oracle缓慢的问题
  10. RabbitMQ+haproxy+keeplived 高可用负载均衡高可用镜像集群队列_01