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实现获取序列中最小的几个元素
Sep 25 Python
详解Python操作RabbitMQ服务器消息队列的远程结果返回
Jun 30 Python
Python实现随机生成手机号及正则验证手机号的方法
Apr 25 Python
django解决跨域请求的问题
Nov 11 Python
Python简单处理坐标排序问题示例
Jul 11 Python
Python PyQt5 Pycharm 环境搭建及配置详解(图文教程)
Jul 16 Python
Python 剪绳子的多种思路实现(动态规划和贪心)
Feb 24 Python
Python使用Socket实现简单聊天程序
Feb 28 Python
python爬虫学习笔记之pyquery模块基本用法详解
Apr 09 Python
Python使用pdb调试代码的技巧
May 03 Python
Django后端分离 使用element-ui文件上传方式
Jul 12 Python
python实现xlwt xlrd 指定条件给excel行添加颜色
Jul 14 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 显示指定路径下的图片
2009/10/29 PHP
解决PhpMyAdmin中导入2M以上大文件限制的方法分享
2014/06/06 PHP
PHP常用处理静态操作类
2015/04/03 PHP
使用一个for循环将N*N的二维数组的所有值置1实现方法
2017/05/29 PHP
使Ext的Template可以解析二层的json数据的方法
2007/12/22 Javascript
jQuery实现的类flash菜单效果代码
2010/05/17 Javascript
javascript对话框使用方法(警告框 javascript确认框 提示框)
2014/01/07 Javascript
JS中使用apply方法通过不同数量的参数调用函数的方法
2016/05/31 Javascript
JS结合bootstrap实现基本的增删改查功能
2016/07/22 Javascript
Bootstrap table的使用方法
2016/11/02 Javascript
Bootstrap Table使用整理(二)
2017/06/09 Javascript
JS中Object对象的原型概念基础
2018/01/29 Javascript
微信小程序之圆形进度条实现思路
2018/02/22 Javascript
Vue2.0 事件的广播与接收(观察者模式)
2018/03/14 Javascript
angular4强制刷新视图的方法
2018/10/09 Javascript
小程序页面动态配置实现方法
2019/02/05 Javascript
[01:59]翻天覆地,因你而变,7.20版本地图更新速览
2018/11/24 DOTA
python妹子图简单爬虫实例
2015/07/07 Python
python代码 if not x: 和 if x is not None: 和 if not x is None:使用介绍
2016/09/21 Python
Python向日志输出中添加上下文信息
2017/05/24 Python
python 查找文件名包含指定字符串的方法
2018/06/05 Python
python 对txt中每行内容进行批量替换的方法
2018/07/11 Python
Python语言快速上手学习方法
2018/12/14 Python
对python中xlsx,csv以及json文件的相互转化方法详解
2018/12/25 Python
Python3实现二叉树的最大深度
2019/09/30 Python
浅析使用Python搭建http服务器
2019/10/27 Python
python读取mysql数据绘制条形图
2020/03/25 Python
Canvas中设置width与height的问题浅析
2018/11/01 HTML / CSS
瑞典最大的儿童用品网上商店:pinkorblue.se
2021/03/09 全球购物
优秀求职自荐信怎样写
2013/12/18 职场文书
中专自我鉴定
2014/02/05 职场文书
党的群众路线教育实践活动批评与自我批评
2014/02/16 职场文书
党员个人公开承诺书
2014/08/29 职场文书
2015年生活老师工作总结
2015/05/27 职场文书
个人道歉信大全
2019/04/11 职场文书
nodejs利用readline提示输入内容实例代码
2021/07/15 NodeJs