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 cookielib 登录人人网的实现代码
Dec 19 Python
Python的re模块正则表达式操作
May 25 Python
深入了解Python中pop和remove的使用方法
Jan 09 Python
100行python代码实现跳一跳辅助程序
Jan 15 Python
一条命令解决mac版本python IDLE不能输入中文问题
May 15 Python
Python实现基于POS算法的区块链
Aug 07 Python
python 获取页面表格数据存放到csv中的方法
Dec 26 Python
wxPython实现整点报时
Nov 18 Python
Python爬取网站图片并保存的实现示例
Feb 26 Python
python中的装饰器该如何使用
Jun 18 Python
python调用ffmpeg命令行工具便捷操作视频示例实现过程
Nov 01 Python
使用python绘制分组对比柱状图
Apr 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
咖啡因含量是由谁决定的?低因咖啡怎么来?低因咖啡适合什么人喝
2021/03/06 新手入门
PHP 编写的 25个游戏脚本
2009/05/11 PHP
完美解决令人抓狂的zend studio 7代码提示(content Assist)速度慢的问题
2013/06/20 PHP
一个简洁实用的PHP缓存类完整实例
2014/07/26 PHP
PHP采集静态页面并把页面css,img,js保存的方法
2014/12/23 PHP
PHP简单实现合并2个数字键数组值的方法
2017/05/30 PHP
HR vs CL BO3 第一场 2.13
2021/03/10 DOTA
js实现iframe动态调整高度的代码
2008/01/06 Javascript
用jQuery打造TabPanel效果代码
2010/05/22 Javascript
Javascript 面向对象编程(coolshell)
2012/03/18 Javascript
jQuery.prototype.init选择器构造函数源码思路分析
2013/02/05 Javascript
jquery购物车实时结算特效实现思路
2013/09/23 Javascript
js的Boolean对象初始值示例
2014/03/04 Javascript
根据当前时间在jsp页面上显示上午或下午
2014/08/18 Javascript
使用jquery组件qrcode生成二维码及应用指南
2015/02/22 Javascript
jQuery点击按钮弹出遮罩层且内容居中特效
2015/12/14 Javascript
Vue.js每天必学之构造器与生命周期
2016/09/05 Javascript
详解获取jq ul第一个li定位的四种解决方案
2016/11/23 Javascript
浅析Ajax语法
2016/12/05 Javascript
Vue项目中使用jsonp抓取跨域数据的方法
2019/11/10 Javascript
跟老齐学Python之再深点,更懂list
2014/09/20 Python
Python验证文件是否可读写代码分享
2017/12/11 Python
Python动刷新抢12306火车票的代码(附源码)
2018/01/24 Python
使用pandas读取csv文件的指定列方法
2018/04/21 Python
python矩阵转换为一维数组的实例
2018/06/05 Python
dataframe 按条件替换某一列中的值方法
2019/01/29 Python
Python利用matplotlib做图中图及次坐标轴的实例
2019/07/08 Python
python查看文件大小和文件夹内容的方法
2019/07/08 Python
python实现AdaBoost算法的示例
2020/10/03 Python
C#实现启动一个进程
2016/10/01 面试题
学校师德承诺书
2014/05/23 职场文书
运动与健康自我评价
2015/03/09 职场文书
2015年会计个人工作总结
2015/04/02 职场文书
2015年法务工作总结范文
2015/05/23 职场文书
导游词之南京中山陵
2019/11/27 职场文书
JavaScript中10个Reduce常用场景技巧
2022/06/21 Javascript