Python基于回溯法子集树模板实现图的遍历功能示例


Posted in Python onSeptember 05, 2017

本文实例讲述了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,称为一条路径。请找出所有可能的路径。

分析

将这个图可视化如下:

Python基于回溯法子集树模板实现图的遍历功能示例

本问题涉及到图,那首先要考虑图用那种存储结构表示。邻接矩阵、邻接表、...都不太熟。

前面这篇文章https://3water.com/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基于回溯法子集树模板实现图的遍历功能示例

更多关于Python相关内容可查看本站专题:《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python完成FizzBuzzWhizz问题(拉勾网面试题)示例
May 05 Python
Python使用django获取用户IP地址的方法
May 11 Python
Python列表list内建函数用法实例分析【insert、remove、index、pop等】
Jul 24 Python
详解python实现线程安全的单例模式
Mar 05 Python
Django框架模板语言实例小结【变量,标签,过滤器,继承,html转义】
May 23 Python
Puppeteer使用示例详解
Jun 20 Python
使用Python计算玩彩票赢钱概率
Jun 26 Python
pyenv与virtualenv安装实现python多版本多项目管理
Aug 17 Python
Pytorch.nn.conv2d 过程验证方式(单,多通道卷积过程)
Jan 03 Python
python利用opencv实现SIFT特征提取与匹配
Mar 05 Python
Python之字典添加元素的几种方法
Sep 30 Python
Python 实现劳拉游戏的实例代码(四连环、重力四子棋)
Mar 03 Python
Python数据结构与算法之图结构(Graph)实例分析
Sep 05 #Python
利用Python将时间或时间间隔转为ISO 8601格式方法示例
Sep 05 #Python
python进程管理工具supervisor的安装与使用教程
Sep 05 #Python
基于Django模板中的数字自增(详解)
Sep 05 #Python
用python结合jieba和wordcloud实现词云效果
Sep 05 #Python
python基础_文件操作实现全文或单行替换的方法
Sep 04 #Python
python 生成器协程运算实例
Sep 04 #Python
You might like
php集成套件服务器xampp安装使用教程(适合第一次玩PHP的新手)
2015/06/03 PHP
php导出中文内容excel文件类实例
2015/07/06 PHP
js实现DIV的一些简单控制
2007/06/04 Javascript
通过url查找a元素应用案例
2014/04/29 Javascript
JQuery中clone方法复制节点
2015/05/18 Javascript
微信小程序wx.previewImage预览图片实例详解
2017/12/07 Javascript
详解JavaScript的BUG和错误
2018/05/07 Javascript
vue-router 源码实现前端路由的两种方式
2018/07/02 Javascript
Layui tree 下拉菜单树的实例代码
2019/09/21 Javascript
vue导航栏部分的动态渲染实例
2019/11/01 Javascript
用Golang运行JavaScript的实现示例
2019/11/25 Javascript
[05:35]DOTA2英雄梦之声_第13期_拉比克
2014/06/21 DOTA
python操作MySQL 模拟简单银行转账操作
2017/09/27 Python
Python实现迭代时使用索引的方法示例
2018/06/05 Python
python利用requests库模拟post请求时json的使用教程
2018/12/07 Python
解决python字典对值(值为列表)赋值出现重复的问题
2019/01/20 Python
关于python之字典的嵌套,递归调用方法
2019/01/21 Python
利用python实现在微信群刷屏的方法
2019/02/21 Python
python智联招聘爬虫并导入到excel代码实例
2019/09/09 Python
Python数据可视化:泊松分布详解
2019/12/07 Python
解决python 读取 log日志的编码问题
2019/12/24 Python
python实现多进程按序号批量修改文件名的方法示例
2019/12/30 Python
Django自定义YamlField实现过程解析
2020/11/11 Python
使用HTML5捕捉音频与视频信息概述及实例
2018/08/22 HTML / CSS
台湾旅游网站:灿星旅游
2018/10/11 全球购物
幼儿园教研活动总结
2014/04/30 职场文书
低碳环保口号
2014/06/12 职场文书
应届毕业生求职信范文
2014/07/07 职场文书
小学安全汇报材料
2014/08/14 职场文书
公务员考察材料
2014/12/23 职场文书
2015年医院护理部工作总结
2015/04/23 职场文书
幼儿园庆元旦主持词
2015/07/06 职场文书
优秀学生主要事迹怎么写
2015/11/04 职场文书
Python 实现绘制子图及子图刻度的变换等问题
2021/05/31 Python
python如何利用traceback获取详细的异常信息
2021/06/05 Python
Java 深入探究讲解简单工厂模式
2022/04/07 Java/Android