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中fileno()方法的使用
May 24 Python
详解用python实现简单的遗传算法
Jan 02 Python
python二维列表一维列表的互相转换实例
Jul 02 Python
python实现京东秒杀功能
Jul 30 Python
python画柱状图--不同颜色并显示数值的方法
Dec 13 Python
使用Python批量修改文件名的代码实例
Jan 24 Python
Python发展简史 Python来历
May 14 Python
Python解析json代码实例解析
Nov 25 Python
Pytorch .pth权重文件的使用解析
Feb 14 Python
浅谈对python中if、elif、else的误解
Aug 20 Python
opencv python 对指针仪表读数识别的两种方式
Jan 14 Python
Python使用pyecharts控件绘制图表
Jun 05 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
屏蔽浏览器缓存另类方法
2006/10/09 PHP
PHP中用header图片地址 简单隐藏图片源地址
2008/04/09 PHP
PHP获取163、gmail、126等邮箱联系人地址【已测试2009.10.10】
2009/10/11 PHP
PH P5.2至5.5、5.6的新增功能详解
2014/07/14 PHP
用PHP做了一个领取优惠券活动的示例代码
2019/07/05 PHP
JQuery魔力之$(&quot;tagName&quot;)与selector
2012/03/05 Javascript
JavaScript将相对地址转换为绝对地址示例代码
2013/07/19 Javascript
jQuery中removeProp()方法用法实例
2015/01/05 Javascript
jQuery实现加入购物车飞入动画效果
2015/03/14 Javascript
JavaScript对Cookie进行读写操作实例
2015/07/25 Javascript
一道常被人轻视的web前端常见面试题(JS)
2016/02/15 Javascript
javascript实现简易计算器的代码
2016/05/31 Javascript
用angular实现多选按钮的全选与反选实例代码
2017/05/23 Javascript
JS小球抛物线轨迹运动的两种实现方法详解
2017/12/20 Javascript
ES6中字符串的使用方法扩展
2019/06/04 Javascript
动态创建类实例代码
2009/10/07 Python
玩转python爬虫之URLError异常处理
2016/02/17 Python
Python使用pylab库实现画线功能的方法详解
2017/06/08 Python
Python探索之创建二叉树
2017/10/25 Python
Python3中bytes类型转换为str类型
2018/09/27 Python
浅谈python多线程和多线程变量共享问题介绍
2020/04/17 Python
解析Python 偏函数用法全方位实现
2020/06/26 Python
英国知名奢侈品包包品牌:Milli Millu
2016/12/22 全球购物
商务英语专业自荐信
2013/10/14 职场文书
应届生求职推荐信
2013/10/28 职场文书
质检的岗位职责
2013/11/17 职场文书
大学生求职自荐信
2013/12/12 职场文书
承认错误的检讨书
2014/01/30 职场文书
《郑和远航》教学反思
2014/04/16 职场文书
小学爱国卫生月活动总结
2014/06/30 职场文书
毕业证丢失证明范本
2014/09/20 职场文书
教师党的群众路线教育实践活动学习心得体会
2014/10/30 职场文书
人事任命通知
2015/04/20 职场文书
2015年乡镇妇联工作总结
2015/05/19 职场文书
文艺节目主持词
2015/07/06 职场文书
一篇文章弄清楚Ajax请求的五个步骤
2022/03/17 Javascript