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 pdb调试方法分享
Jan 21 Python
在Python中封装GObject模块进行图形化程序编程的教程
Apr 14 Python
python使用range函数计算一组数和的方法
May 07 Python
python3.4下django集成使用xadmin后台的方法
Aug 15 Python
python之virtualenv的简单使用方法(必看篇)
Nov 25 Python
Django中的ajax请求
Oct 19 Python
Python操作redis实例小结【String、Hash、List、Set等】
May 16 Python
python二进制文件的转译详解
Jul 03 Python
Python高阶函数、常用内置函数用法实例分析
Dec 26 Python
Tensorflow 多线程设置方式
Feb 06 Python
Python 中的pygame安装与配置教程详解
Feb 10 Python
Tensorflow 模型转换 .pb convert to .lite实例
Feb 12 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
PHP4之真OO
2006/10/09 PHP
php模拟用户自动在qq空间发表文章的方法
2015/01/07 PHP
使用JavaScript创建新样式表和新样式规则
2016/06/14 PHP
Thinkphp整合微信支付功能
2016/12/14 PHP
PHP并发查询MySQL的实例代码
2017/08/09 PHP
JS仿百度搜索自动提示框匹配查询功能
2013/11/21 Javascript
js中同步与异步处理的方法和区别总结
2013/12/25 Javascript
实现图片预加载的三大方法及优缺点分析
2014/11/19 Javascript
node.js中的http.response.write方法使用说明
2014/12/14 Javascript
JavaScript中String.match()方法的使用详解
2015/06/06 Javascript
JavaScript提高性能知识点汇总
2016/01/15 Javascript
AngularJS页面访问时出现页面闪烁问题的解决
2016/03/06 Javascript
JS组件Bootstrap Table使用实例分享
2016/05/30 Javascript
js选择器全面解析
2016/06/27 Javascript
如何在JS中实现相互转换XML和JSON
2016/07/19 Javascript
BootStrap入门教程(二)之固定的内置样式
2016/09/19 Javascript
使用requirejs模块化开发多页面一个入口js的使用方式
2017/06/14 Javascript
解决layui上传文件提示上传异常,实际文件已经上传成功的问题
2018/08/19 Javascript
Python开发编码规范
2006/09/08 Python
python的常见命令注入威胁
2013/02/18 Python
python算法演练_One Rule 算法(详解)
2017/05/17 Python
Pyspider中给爬虫伪造随机请求头的实例
2018/05/07 Python
Python使用Pickle模块进行数据保存和读取的讲解
2019/04/09 Python
python实现给微信指定好友定时发送消息
2019/04/29 Python
pycharm设置python文件模板信息过程图解
2020/03/10 Python
python文件编写好后如何实践
2020/07/07 Python
python爬虫利用代理池更换IP的方法步骤
2021/02/21 Python
基于HTML5 Canvas的3D动态Chart图表的示例
2017/11/02 HTML / CSS
路政管理专业推荐信
2013/11/11 职场文书
公司领导班子四风对照检查材料
2014/09/27 职场文书
父亲婚礼答谢词
2015/01/04 职场文书
沈阳故宫导游词
2015/01/31 职场文书
常住证明范本
2015/06/23 职场文书
学校食堂管理制度
2015/08/04 职场文书
小学生安全教育心得体会
2016/01/15 职场文书
Python实现8种常用抽样方法
2021/06/27 Python