python深度优先_python数据结构之图深度优先和广度优先实例详解

本文实例讲述了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程序设计有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/527401.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql sum id 5_mysql怎么使用sum()求id字段的和?

mysql使用sum()求id字段的和的方法:利用“SELECT SUM(id) FROM 数据表名;”来求id字段的和,返回id字段值的总和;SUM()函数在计算时,忽略列值为NULL的行。(推荐教程:mysql视频教程)SUM() 函数返回数值列的总数。SQL SUM…

python问卷调查系统设计案例_从设计到施工,全面剖析超级玻璃屋面系统案例!...

【设计师的材料清单】戳图即可购买《设计师的材料清单》实体书或获取高清电子书转载整理自:弗思特(ID:FFTCCL)各位设计师大家好!随着人们对建筑外观及内部环境要求的不断提高具有大面积采光且轻盈的玻璃屋面系统在大型公共建筑设计中被广泛使…

mysql如何建外建_mysql如何建立外键

mysql如何建立外键一个主表blog博客表,DROP TABLE IF EXISTS blog;CREATE TABLE blog (id int(11) NOT NULL auto_increment,title varchar(11) default NULL,content varchar(11) default NULL,PRIMARY KEY (id)) ENGINEInnoDB DEFAULT CHARSETgb2312;另一个表comment,评论表…

二叉树的建立与遍历完整代码_腾讯面试官这样问我二叉树,我刚好都会

前记上周我投递出了简历,岗位是后端开发工程师。这周腾讯面试官给我进行了视频面试。面试过程中他问了二叉树的问题。二叉树相关算法题,在面试中出现的次数非常非常多,所以我面试之前也有所准备。今天结合面试问题详细讲一讲二叉树&#xff0…

python教程程序_Python如何发布程序的详细教程

如何发布一个Python程序:1.安装一个pyInstaller在pycharm里点 file —–>setting—–>Project workspace——>Interpreter——>点pip右边的+号,进入下面这个界面:搜索pyInstaller, 点击左下方Iinstall package安装(出…

创建mysql数据库图解_mysql数据库怎么创建外键?(图文+视频)

本篇文章主要给大家介绍mysql数据库怎么创建外键。关于mysql数据库外键的基础介绍,我们在这篇文章【Mysql外键是什么?有哪些用处?】中,已经给大家介绍过了,需要的朋友可以选择参考。了解了外键的基础定义,那…

redis 管理工具_Redis桌面管理工具Redis Desktop Manager 2019.2发布

简介Redis桌面管理器(又名RDM) - 是适用于Windows,Linux和MacOS的快速开源Redis数据库管理应用程序。该工具为您提供了一个易于使用的GUI,可以访问您的Redis数据库并执行一些基本操作:将键视为树,CRUD键,通过shell执行…

如何保护python代码_如何在发布之前保护我的Python代码?

由于Python是一种按设计进行解释的语言,而且它将代码编译为字节码(这无助于隐藏它,因为字节码更容易反转),因此没有真正安全的方法来隐藏源代码,因为它是不可恢复的,任何编程语言都是如此。在一开始,如果你…

python pandas教程百家号_Pandas 常见的基本方法

说明:文章所有内容均截选自实验楼教程【Pandas 使用教程】,想要查看教程完整内容,点击教程即可~前言:Pandas 是非常著名的开源数据处理工具,我们可以通过它对数据集进行快速读取、转换、过滤、分析等一系列操作。除此之…

python查看系统句柄数量_linux下查看系统进程占用的句柄数方法

---查看系统默认的最大文件句柄数,系统默认是1024# ulimit -n1024----查看当前进程打开了多少句柄数# lsof -n|awk {print $2}|sort|uniq -c|sort -nr|more131 2420457 2424457 24231   ........其中第一列是打开的句柄数,第二列是进程ID。可以根据ID号…

java静态变量实例变量_java中静态变量和实例变量的区别

实例变量:只有在创建了实例对象之后才会被分配空间,才可以使用静态变量:不需要创建实例对象就可以直接使用类名进行引用public class Different {public static int staticInt 0;//静态变量public int insInt 0;//实例变量public Different…

sql in里面可以放多少参数_如何从文本文件读入 SQL 参数

有时我们希望把参数列表分行存储在文本文件里,执行SQL时再拼到in函数里,从而查询出符合条件的记录。但SQL不能解析文本文件,直接拼到in函数里有困难,所以很多人先把文件导入数据库临时表,再用join语句做关联&#xff0…

java sca视频教程_如何进入Java SCA软件的开发

该文档是SCA Java项目的开发者指南l一般性指南l获取源代码l配置你的开发环境l构建二进制和源代码发布包l导入SCA模块到你的开发IDE环境中l理解SCA代码路径l编码指南l测试lMaven构建结构l报告遇到的问题和提供补丁l开发提示为Webapp样例代码生成Eclipse WTP Web工程为样例中的程…

谷歌浏览器32位安装包_谷歌浏览器发布紧急安全更新修复Blink内核中的任意代码执行漏洞...

上月底谷歌浏览器推送紧急安全更新对浏览器漏洞进行修复,当时谷歌浏览器博客并未公布漏洞的具体细节信息。蓝点网当时也在文章中称通常这种不公布漏洞的更新,都是比较严重的问题因此只有等多数用户修复后才会公开。现在多数能够自动更新的用户已经升级到…

java js webservice_java Web技术探路:js Ajax调用WebService

StuList new List();for (int i 0; i < 10; i){Student s new Student();s.Sid i 1;s.Name "Tom"s.Sid;s.Sex "男";s.Age i 1;StuList.Add(s);}return StuList;}}}注意&#xff1a;我们分别看一下这几个方法的签名&#xff0c;这很重要&#x…

python下载晚上excel_Python自动操控excel,一小时解决你一天的工作

过去&#xff0c;在很多金融、市场、行政的招聘中&#xff0c;面试官都会问一句&#xff1a;“你精通 EXCEL 吗&#xff1f;”但今天&#xff0c;他们可能更喜欢问&#xff1a;“你会 Python 吗&#xff1f;”越来越多的企业开始用 Python 处理数据&#xff0c;特别是金融、证券…

java 注释 过时_Java 注解

前言为什么需要学习注解?1.能够灵活地使用框架提供的注解,最后能够读懂框架的源码2.能够配合反射将代码书写更加的灵活,更加易于维护易于扩展,Properties配置,XML配置,注解配置[Java配置]3.极大程度地简化了代码,提高了代码的可读性注解的概述Java提供了一种源程序中元素和任何…

python模拟登录淘宝直通车_Python实现的淘宝直通车数据抓取(1)

最近帮一个朋友做一个抓取淘宝直通车数据的小项目&#xff0c;感觉ython比较适合写爬虫程序&#xff0c;决定使用Python来做程序。首先是登陆程序&#xff0c;因为淘宝的登陆校验很复杂&#xff0c;所以不能直接使用命令行的形式输入账号密码。查阅资料后&#xff0c;发现可以使…

java的serversocket_Java ServerSocket 实现聊天室功能(简易版)

大体实现功能可以选择房间&#xff0c;可以与房间中的用户进行实时的交流说在前面的话:serverSocket.accept() 会形成阻塞scanner.hasNextLine() 和 scanner.nextLine() 也会形成阻塞windows 下需要打开telnet服务。请自行百度实现思路:用户连接上服务器后选择房间号&#xff0…

python爬虫验证码的识别_Python爬虫识别验证码

Python爬虫识别验证码安装tesserocrpip3 install tesserocr pillow识别测试将验证码图片放到项目根目录下&#xff0c;用tesserocr库识别该验证码&#xff0c;代码如下所示&#xff1a;import localelocale.setlocale(locale.LC_ALL, C)import tesserocrfrom PIL import Imagei…