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 28 Python
Python深入学习之特殊方法与多范式
Aug 31 Python
python关闭windows进程的方法
Apr 18 Python
Python字符编码与函数的基本使用方法
Sep 30 Python
flask中使用蓝图将路由分开写在不同文件实例解析
Jan 19 Python
python3+PyQt5图形项的自定义和交互 python3实现page Designer应用程序
Jul 20 Python
tensorflow saver 保存和恢复指定 tensor的实例讲解
Jul 26 Python
解决PyCharm控制台输出乱码的问题
Jan 16 Python
我就是这样学习Python中的列表
Jun 02 Python
Python实现12306火车票抢票系统
Jul 04 Python
python能开发游戏吗
Jun 11 Python
sklearn和keras的数据切分与交叉验证的实例详解
Jun 19 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
2006/12/23 PHP
Ajax PHP 边学边练 之三 数据库
2009/11/26 PHP
php判断当前用户已在别处登录的方法
2015/01/06 PHP
详谈PHP程序Laravel 5框架的优化技巧
2016/07/18 PHP
PHP实现将MySQL重复ID二维数组重组为三维数组的方法
2016/08/01 PHP
php伪静态验证码不显示的解决方案
2019/09/26 PHP
最简单的jQuery程序 入门者学习
2009/07/09 Javascript
javascript自定义startWith()和endWith()的两种方法
2013/11/11 Javascript
jquery实现页面图片等比例放大缩小功能
2014/02/12 Javascript
jquery scroll()区分横向纵向滚动条的方法
2014/04/04 Javascript
DOM节点的替换或修改函数replaceChild()用法实例
2015/01/12 Javascript
javascript实现输出指定行数正方形图案的方法
2015/08/03 Javascript
举例讲解JavaScript中关于对象操作的相关知识
2015/11/16 Javascript
简单谈谈javascript中this的隐式绑定
2016/02/22 Javascript
JavaScript判断数组重复内容的两种方法(推荐)
2016/06/06 Javascript
前端开发必知的15个jQuery小技巧
2017/01/22 Javascript
利用jqprint插件打印页面内容的实现方法
2018/01/09 Javascript
Node.js API详解之 querystring用法实例分析
2020/04/29 Javascript
three.js 如何制作魔方
2020/07/31 Javascript
Python创建日历实例
2014/08/21 Python
pycharm安装图文教程
2017/05/02 Python
python3 对list中每个元素进行处理的方法
2018/06/29 Python
Python基于多线程操作数据库相关问题分析
2018/07/11 Python
python识别文字(基于tesseract)代码实例
2019/08/24 Python
python实现在多维数组中挑选符合条件的全部元素
2019/11/26 Python
python单向循环链表原理与实现方法示例
2019/12/03 Python
Python字典生成式、集合生成式、生成器用法实例分析
2020/01/07 Python
tensorflow之读取jpg图像长和宽实例
2020/06/18 Python
澳大利亚领先的女帽及配饰公司:Morgan&Taylor
2019/12/01 全球购物
幼儿园实习生辞职信
2014/01/20 职场文书
护士自我鉴定怎么写
2014/02/07 职场文书
优秀班主任先进事迹材料
2014/12/16 职场文书
安全先进班组材料
2014/12/26 职场文书
司机岗位职责范本
2015/04/10 职场文书
2015年科研工作总结范文
2015/05/13 职场文书
会议承办单位欢迎词
2015/09/30 职场文书