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中的对象拷贝示例 python引用传递
Jan 23 Python
python中Pycharm 输出中文或打印中文乱码现象的解决办法
Jun 16 Python
Python 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)
Mar 19 Python
python实现括号匹配的思路详解
Aug 23 Python
Python读取系统文件夹内所有文件并统计数量的方法
Oct 23 Python
pycharm debug功能实现跳到循环末尾的方法
Nov 29 Python
Python接口自动化判断元素原理解析
Feb 24 Python
Django contrib auth authenticate函数源码解析
Nov 12 Python
python实现学生信息管理系统(精简版)
Nov 27 Python
python邮件中附加文字、html、图片、附件实现方法
Jan 04 Python
Python基础之pandas数据合并
Apr 27 Python
Python办公自动化之Excel(中)
May 24 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 删除无限级目录与文件代码共享
2008/11/22 PHP
php IP及IP段进行访问限制的代码
2008/12/17 PHP
php 团购折扣计算公式
2011/11/24 PHP
php编程实现简单的网页版计算器功能示例
2017/04/26 PHP
PHP常用操作类之通信数据封装类的实现
2017/07/16 PHP
javascript 函数调用规则
2009/08/26 Javascript
5秒后跳转效果(setInterval/SetTimeOut)
2013/05/03 Javascript
jquery导航制件jquery鼠标经过变色效果示例
2013/12/05 Javascript
node.js中的path.resolve方法使用说明
2014/12/08 Javascript
对JavaScript的全文搜索实现相关度评分的功能的方法
2015/06/24 Javascript
MVC+jQuery.Ajax异步实现增删改查和分页
2020/12/22 Javascript
AngularJS基础 ng-srcset 指令简单示例
2016/08/03 Javascript
JS快速实现移动端拼图游戏
2016/09/05 Javascript
详解webpack 配合babel 将es6转成es5 超简单实例
2017/05/02 Javascript
bootstrap daterangepicker汉化以及扩展功能
2017/06/15 Javascript
Vant的安装和配合引入Vue.js项目里的方法步骤
2018/12/05 Javascript
Vue 中如何正确引入第三方模块的方法步骤
2019/05/05 Javascript
vue动态配置模板 'component is'代码
2019/07/04 Javascript
详解基于 Node.js 的轻量级云函数功能实现
2019/07/08 Javascript
python 远程统计文件代码分享
2015/05/14 Python
json跨域调用python的方法详解
2017/01/11 Python
JSONLINT:python的json数据验证库实例解析
2017/11/28 Python
详解Python学习之安装pandas
2019/04/16 Python
Django文件存储 自己定制存储系统解析
2019/08/02 Python
Python帮你微信头像任意添加装饰别再@微信官方了
2019/09/25 Python
给大家整理了19个pythonic的编程习惯(小结)
2019/09/25 Python
Python算法中的时间复杂度问题
2019/11/19 Python
tensorflow 利用expand_dims和squeeze扩展和压缩tensor维度方式
2020/02/07 Python
Python如何实现爬取B站视频
2020/05/20 Python
亚马逊加拿大网站:Amazon.ca
2020/01/06 全球购物
PHP解析URL是哪个函数?怎么用?
2013/05/09 面试题
雅虎笔试题(字符串操作)
2015/03/24 面试题
优秀毕业生求职推荐信范文
2013/11/21 职场文书
就业协议书范本
2014/04/11 职场文书
理想国读书笔记
2015/06/25 职场文书
MySQL 存储过程的优缺点分析
2021/05/20 MySQL