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字典序问题实例
Sep 26 Python
Python cookbook(数据结构与算法)实现对不原生支持比较操作的对象排序算法示例
Mar 15 Python
Python实现按中文排序的方法示例
Apr 25 Python
浅谈Series和DataFrame中的sort_index方法
Jun 07 Python
浅谈关于Python3中venv虚拟环境
Aug 01 Python
Python用5行代码写一个自定义简单二维码
Oct 21 Python
python-tkinter之按钮的使用,开关方法
Jun 11 Python
解决在pycharm运行代码,调用CMD窗口的命令运行显示乱码问题
Aug 23 Python
Pytorch实现基于CharRNN的文本分类与生成示例
Jan 08 Python
python实现简单学生信息管理系统
Apr 09 Python
jupyter notebook 多环境conda kernel配置方式
Apr 10 Python
VS2019+python3.7+opencv4.1+tensorflow1.13配置详解
Apr 16 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
Zerg基本策略
2020/03/14 星际争霸
浅谈PHP 闭包特性在实际应用中的问题
2009/10/30 PHP
php解决约瑟夫环示例
2014/04/09 PHP
PHP版本常用的排序算法汇总
2015/12/20 PHP
js left,right,mid函数
2008/06/10 Javascript
网页开发中的容易忽略的问题 javascript HTML中的table
2009/04/15 Javascript
javascript 最常用的10个自定义函数[推荐]
2009/12/26 Javascript
一些相见恨晚的 JavaScript 技巧
2010/04/25 Javascript
JS增加行复制行删除行的实现代码
2013/11/09 Javascript
node.js中的socket.io的广播消息
2014/12/15 Javascript
JavaScript中判断变量是数组、函数或是对象类型的方法
2015/02/25 Javascript
jquery.form.js实现将form提交转为ajax方式提交的方法
2015/04/07 Javascript
js实现拉幕效果的广告代码
2015/09/02 Javascript
jQuery横向擦除焦点图特效代码分享
2015/09/06 Javascript
快速学习jQuery插件 Form表单插件使用方法
2015/12/01 Javascript
项目实践一图片上传之form表单还是base64前端图片压缩(前端图片压缩)
2016/07/28 Javascript
JavaScript 过滤关键字
2017/03/20 Javascript
Vue子组件向父组件通信与父组件调用子组件中的方法
2018/06/22 Javascript
js实现div色块碰撞
2020/01/16 Javascript
JavaScript this关键字指向常用情况解析
2020/09/02 Javascript
python中实现定制类的特殊方法总结
2014/09/28 Python
Centos5.x下升级python到python2.7版本教程
2015/02/14 Python
Python实现的多叉树寻找最短路径算法示例
2018/07/30 Python
Python中的相关分析correlation analysis的实现
2019/08/29 Python
python线程join方法原理解析
2020/02/11 Python
jupyter lab文件导出/下载方式
2020/04/22 Python
基于Jquery和Css3代码制作可以缩放的搜索框
2015/11/19 HTML / CSS
aden + anais英国官网:美国婴儿贴身用品品牌
2019/09/08 全球购物
研究生求职推荐信范文
2013/11/30 职场文书
竞选大队干部演讲稿
2014/09/11 职场文书
2014年学生会部门工作总结
2014/11/07 职场文书
2015年仓库工作总结
2015/04/09 职场文书
HTML基础-标签分类(闭合标签,空标签,块级元素,行内元素,行级块元素,可替换元素)
2021/03/31 HTML / CSS
redis内存空间效率问题的深入探究
2021/05/17 Redis
MySQL 8.0 之不可见列的基本操作
2021/05/20 MySQL
Spring Cache和EhCache实现缓存管理方式
2021/06/15 Java/Android