Python基于回溯法子集树模板实现图的遍历功能示例
作者:罗兵 发布时间:2021-10-29 15:20:31
标签:Python,回溯法,图的遍历
本文实例讲述了Python基于回溯法子集树模板实现图的遍历功能。分享给大家供大家参考,具体如下:
问题
一个图:
A --> B
A --> C
B --> C
B --> D
B --> E
C --> A
C --> D
D --> C
E --> F
F --> C
F --> D
从图中的一个节点E出发,不重复地经过所有其它节点后,回到出发节点E,称为一条路径。请找出所有可能的路径。
分析
将这个图可视化如下:
本问题涉及到图,那首先要考虑图用那种存储结构表示。邻接矩阵、邻接表、...都不太熟。
前面这篇文章https://www.jb51.net/article/122927.htm有一种最简洁的邻接表表示方式。
接下来对问题本身进行分析:
显然,问题的解的长度是固定的,亦即所有的路径长度都是固定的:n(不回到出发节点) 或 n+1(回到出发节点)
每个节点,都有各自的邻接节点。
对某个节点来说,它的所有邻接节点,可以看作这个节点的状态空间。遍历其状态空间,剪枝,深度优先递归到下一个节点。搞定!
至此,很明显套用回溯法子集树模板。
代码:
'''
图的遍历
从一个节点出发,不重复地经过所有其它节点后,回到出发节点。找出所有的路径
'''
# 用邻接表表示图
n = 6 # 节点数
a,b,c,d,e,f = range(n) # 节点名称
graph = [
{b,c},
{c,d,e},
{a,d},
{c},
{f},
{c,d}
]
x = [0]*(n+1) # 一个解(n+1元数组,长度固定)
X = [] # 一组解
# 冲突检测
def conflict(k):
global n,graph,x
# 第k个节点,是否前面已经走过
if k < n and x[k] in x[:k]:
return True
# 回到出发节点
if k == n and x[k] != x[0]:
return True
return False # 无冲突
# 图的遍历
def dfs(k): # 到达(解x的)第k个节点
global n,a,b,c,d,e,f,graph,x,X
if k > n: # 解的长度超出,已走遍n+1个节点 (若不回到出发节点,则 k==n)
print(x)
#X.append(x[:])
else:
for node in graph[x[k-1]]: # 遍历节点x[k]的邻接节点(x[k]的所有状态)
x[k] = node
if not conflict(k): # 剪枝
dfs(k+1)
# 测试
x[0] = e # 出发节点
dfs(1) # 开始处理解x中的第2个节点
效果图:
希望本文所述对大家Python程序设计有所帮助。
来源:http://www.cnblogs.com/hhh5460/p/6928465.html


猜你喜欢
- 1 调试过程用Python3.6+Sciter+PyCharm写了一个py测试脚本helloworld.py,该脚本中只含有一条语句“imp
- 前言只有你想不到,没有我找不到写不了的好游戏!哈喽。我是你们的栗子同学啦~今天小编去了我朋友家里玩儿,看到了一个敲可爱的小狗狗,是我朋友养的
- python制作超级玛丽游戏,供大家参考,具体内容如下这篇文章,我们优先介绍超级玛丽游戏中的多状态跳跃,和行走地图拖动的原理,然后实现。并实
- 前言本篇文章主要是记录一下在 GScript 中实现递归调用时所遇到的坑,类似的问题在中文互联网上我几乎没有找到相关的内容,所以还是很有必要
- 1.打包多个py文件并且去除cmd黑框格式:pyinstaller.exe -F 路径\文件名.py空格路径\文件名.py空格--nocon
- Python中为了方便程序直接生成exe文件,它存在一个pyinstaller库,使用这个库可以直接将.py程序生成exe文件。这个命令不是
- 介绍图像分类器通常在训练更多的图像时表现得更好。在图像分类模型中,一个常见的问题是,模型不能正确地对图像进行分类,只是因为它没有针对同一图像
- MySql总是定时弹出一个MySQLInstallerConsole.exe的窗口,如何解决呐?这貌似是一条安装命令,Installing
- 箱形图概念后面的图形都是一些专业的统计图形,当然也会是我们可视化的对象。箱形图(Box-plot)又称为盒须图、盒式图或箱线图,是一种用作显
- 当我们修改一份代码的时候,也许会碰到修改后的代码还不如修改之前的代码能够满足自己的需求,那么这个时候我们就需要对代码进行回滚,下面我们来看一
- pydantic-resolve 解决嵌套数据结构的生成和其他方案的比较pydantic-resolve和GraphQL相比GraphQL的
- 为了给你的对像添加一个行级功能,那就定义一个自定义方法。 有鉴于manager经常被用来用一些整表操作(table-wide),模型方法应该
- 本文所述实例可以实现基于Python的查看图片报纸《参考消息》并将当天的图片报纸自动下载到本地供查看的功能,具体实现代码如下:# codin
- 创建表&创建索引create table tbl1 (id int unique, sname varchar(50),index
- 上个项目中用到了ActiveMQ,只是简单应用,安装完成后直接是用就可以了。由于新项目中一些硬件的限制,需要把消息队列换成RabbitMQ。
- 首先要声明一下:一般情况下,修改MySQL密码,授权,是需要有mysql里的root权限的。 注:本操作是在WIN命令提示符下,phpMyA
- 1.在Scrapy工程下新建“middlewares.py”# Importing base64 library because we
- 一、 技术要点 我们都知道Windows应用程序在运行时会启动一个进程,其总包括若干线程,不同的进程之间通信是开发分布
- 写代码时,我们希望把一些操作放到一个代码块中,这样在代码块中执行时就可以保持在某种运行状态,而当离开该代码块时就执行另一个操作,结束当前状态
- 1.1 方法归纳使用 + 直接将多列合并为一列(合并列较少);使用pandas.Series.str.cat方法,将多列合并为一列(合并列较