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函数的作用域规则和闭包(详解)
Nov 29 Python
Python实现简单网页图片抓取完整代码实例
Dec 15 Python
Python使用装饰器进行django开发实例代码
Feb 06 Python
python 编写简单网页服务器的实例
Jun 01 Python
python读取一个目录下所有txt里面的内容方法
Jun 23 Python
python中退出多层循环的方法
Nov 27 Python
OpenCV里的imshow()和Matplotlib.pyplot的imshow()的实现
Nov 25 Python
Python实现微信好友的数据分析
Dec 16 Python
Django 返回json数据的实现示例
Mar 05 Python
PyQt中使用QtSql连接MySql数据库的方法
Jul 28 Python
Python 找出英文单词列表(list)中最长单词链
Dec 14 Python
Opencv实现二维直方图的计算及绘制
Jul 21 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调用MySQL的存储过程的实现代码
2008/08/12 PHP
php日期转时间戳,指定日期转换成时间戳
2012/07/17 PHP
Erlang的运算符(比较运算符,数值运算符,移位运算符,逻辑运算符)
2012/07/23 PHP
用php制作简单分页(从数据库读取记录)的方法详解
2013/05/04 PHP
新手菜鸟必读:session与cookie的区别
2013/08/22 PHP
yii2使用ajax返回json的实现方法
2016/05/14 PHP
php mysqli查询语句返回值类型实例分析
2016/06/29 PHP
php中分页及SqlHelper类用法实例
2017/01/12 PHP
thinkPHP简单导入和使用阿里云OSSsdk的方法
2017/03/15 PHP
PHP框架Laravel中实现supervisor执行异步进程的方法
2017/06/07 PHP
js和php如何获取当前url的内容
2013/09/22 Javascript
js sort 二维数组排序的用法小结
2014/01/24 Javascript
JS获得选取checkbox整行数据的方法
2015/01/28 Javascript
探讨:JavaScript ECAMScript5 新特性之get/set访问器
2016/05/05 Javascript
Angular.Js的自动化测试详解
2016/12/09 Javascript
js获取当前周、上一周、下一周日期
2017/03/19 Javascript
JavaScript登录记住密码操作(超简单代码)
2017/03/22 Javascript
利用jquery如何从json中读取数据追加到html中
2017/12/01 jQuery
JS造成内存泄漏的几种情况实例分析
2020/03/02 Javascript
python中常用的各种数据库操作模块和连接实例
2014/05/29 Python
python 去除txt文本中的空格、数字、特定字母等方法
2018/07/24 Python
Python使用Turtle库绘制一棵西兰花
2019/11/23 Python
Python @property装饰器原理解析
2020/01/22 Python
Python 线性回归分析以及评价指标详解
2020/04/02 Python
用python对excel查重
2020/12/07 Python
CSS3 3D位移translate效果实例介绍
2016/05/03 HTML / CSS
HTML5 Canvas 实现圆形进度条并显示数字百分比效果示例
2017/08/18 HTML / CSS
美国花布包包品牌:Vera Bradley
2017/08/11 全球购物
财务会计人员求职的自我评价
2014/01/13 职场文书
2014信息公开实施方案
2014/02/22 职场文书
廉洁校园实施方案
2014/05/25 职场文书
元旦标语大全
2014/10/09 职场文书
教师党员学习十八届四中全会思想汇报
2014/11/03 职场文书
学习雷锋主题班会
2015/08/14 职场文书
信息技术国培研修日志
2015/11/13 职场文书
“鬼灭之刃”热度不减,其成功背后的原因是什么?
2022/03/22 日漫