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输出一个杨辉三角的例子
Jun 13 Python
在树莓派2或树莓派B+上安装Python和OpenCV的教程
Mar 30 Python
详解Python的Django框架中的templates设置
May 11 Python
Python实现PS滤镜特效Marble Filter玻璃条纹扭曲效果示例
Jan 29 Python
python一行sql太长折成多行并且有多个参数的方法
Jul 19 Python
10 行 Python 代码教你自动发送短信(不想回复工作邮件妙招)
Oct 11 Python
Python3的介绍、安装和命令行的认识(推荐)
Oct 20 Python
Python 保存矩阵为Excel的实现方法
Jan 28 Python
python利用selenium进行浏览器爬虫
Apr 25 Python
Python中一个for循环循环多个变量的示例
Jul 16 Python
Python 实例方法、类方法、静态方法的区别与作用
Aug 14 Python
Python基于mediainfo批量重命名图片文件
Dec 29 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 session 错误
2009/05/21 PHP
file_get_contents获取不到网页内容的解决方法
2013/03/07 PHP
解析PHP跨站刷票的实现代码
2013/06/18 PHP
如何使用PHP批量去除文件UTF8 BOM信息
2013/08/05 PHP
PHP使用Alexa API获取网站的Alexa排名例子
2014/06/12 PHP
php中socket通信机制实例详解
2015/01/03 PHP
php页面,mysql数据库转utf-8乱码,utf-8编码问题总结
2015/08/27 PHP
如何在Web页面上直接打开、编辑、创建Office文档
2007/03/12 Javascript
js返回上一页并刷新代码整理
2012/12/21 Javascript
Javascript数组与字典用法分析
2014/12/13 Javascript
封装好的一个万能检测表单的方法
2015/01/21 Javascript
JavaScript实现下拉列表框数据增加、删除、上下排序的方法
2015/08/11 Javascript
js实现点击切换TAB标签实例
2015/08/21 Javascript
原生JS实现美图瀑布流布局赏析
2015/09/07 Javascript
Web开发必知Javascript技巧大全
2016/02/23 Javascript
jQuery progressbar通过Ajax请求实现后台进度实时功能
2016/10/11 Javascript
前端自动化开发之Node.js的环境搭建教程
2017/04/01 Javascript
自定义vue全局组件use使用、vuex的使用详解
2017/06/14 Javascript
详解在Node.js中发起HTTP请求的5种方法
2019/01/10 Javascript
详解Vue依赖收集引发的问题
2019/04/22 Javascript
简单了解JS打开url的方法
2020/02/21 Javascript
基于Vue.js+Nuxt开发自定义弹出层组件
2020/10/09 Javascript
python之import机制详解
2014/07/03 Python
跟老齐学Python之眼花缭乱的运算符
2014/09/14 Python
python基于queue和threading实现多线程下载实例
2014/10/08 Python
python操作ssh实现服务器日志下载的方法
2015/06/03 Python
Python中遍历字典过程中更改元素导致异常的解决方法
2016/05/12 Python
python 常见字符串与函数的用法详解
2018/11/23 Python
Python基于Opencv来快速实现人脸识别过程详解(完整版)
2019/07/11 Python
在django view中给form传入参数的例子
2019/07/19 Python
Pytorch 中retain_graph的用法详解
2020/01/07 Python
Python多线程Threading、子线程与守护线程实例详解
2020/03/24 Python
以下的初始化有什么区别
2013/12/16 面试题
上班早退检讨书
2014/01/09 职场文书
十八届三中全会感言
2014/03/10 职场文书
javascript之Object.assign()的痛点分析
2022/03/03 Javascript