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 tempfile模块学习笔记(临时文件)
May 25 Python
使用Python脚本来控制Windows Azure的简单教程
Apr 16 Python
Python引用传值概念与用法实例小结
Oct 07 Python
利用Python写一个爬妹子的爬虫
Jun 08 Python
替换python字典中的key值方法
Jul 06 Python
Python BS4库的安装与使用详解
Aug 08 Python
Python CVXOPT模块安装及使用解析
Aug 01 Python
python GUI库图形界面开发之PyQt5信号与槽基础使用方法与实例
Mar 06 Python
TensorFLow 数学运算的示例代码
Apr 21 Python
pytorch VGG11识别cifar10数据集(训练+预测单张输入图片操作)
Jun 24 Python
python Xpath语法的使用
Nov 26 Python
python数据处理之Pandas类型转换
Apr 28 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
基于mysql的论坛(4)
2006/10/09 PHP
用php来改写404错误页让你的页面更友好
2013/01/24 PHP
php数组编码转换示例详解
2014/03/11 PHP
四个常见html网页乱码问题及解决办法
2015/09/08 PHP
PHP实现的多文件上传类及用法示例
2016/05/06 PHP
thinkPHP3.2简单实现文件上传的方法
2016/05/16 PHP
写出更好的JavaScript之undefined篇(上)
2009/11/22 Javascript
jquery 新手学习常见问题解决方法
2010/04/18 Javascript
JS实现定时自动关闭DIV层提示框的方法
2015/05/11 Javascript
javascript+canvas实现刮刮卡抽奖效果
2015/07/29 Javascript
利用JQuery写一个简单的异步分页插件
2016/03/07 Javascript
微信小程序购物商城系统开发系列-目录结构介绍
2016/11/21 Javascript
JavaScript实现打地鼠小游戏
2020/04/23 Javascript
微信小程序中使用Promise进行异步流程处理的实例详解
2017/08/17 Javascript
jQuery实现碰到边缘反弹的动画效果
2018/02/24 jQuery
jQuery中each方法的使用详解
2018/03/18 jQuery
node.js基于socket.io快速实现一个实时通讯应用
2019/04/23 Javascript
jQuery中DOM操作原则实例分析
2019/08/01 jQuery
jquery+ajax实现异步上传文件显示进度条
2020/08/17 jQuery
python笔记(2)
2012/10/24 Python
Python中函数的用法实例教程
2014/09/08 Python
Python实现简单登录验证
2016/04/13 Python
Python3下错误AttributeError: ‘dict’ object has no attribute’iteritems‘的分析与解决
2017/07/06 Python
Python实现PS滤镜碎片特效功能示例
2018/01/24 Python
python搭建服务器实现两个Android客户端间收发消息
2018/04/12 Python
Python中遍历列表的方法总结
2019/06/27 Python
Python 使用 PyMysql、DBUtils 创建连接池提升性能
2019/08/14 Python
Python多线程操作之互斥锁、递归锁、信号量、事件实例详解
2020/03/24 Python
python selenium xpath定位操作
2020/09/01 Python
Python对excel的基本操作方法
2021/02/18 Python
可以使用抽象函数重写基类中的虚函数吗
2013/06/02 面试题
采购员岗位职责
2013/11/15 职场文书
酒店温馨提示语
2015/07/14 职场文书
创业计划书之婴幼儿游泳馆
2019/09/11 职场文书
微信小程序基础教程之echart的使用
2021/06/01 Javascript
Win11 Build 25179预览版发布(附更新内容+ISO官方镜像下载)
2022/08/14 数码科技