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操作列表的常用方法分享
Feb 13 Python
分享6个隐藏的python功能
Dec 07 Python
Python KMeans聚类问题分析
Feb 23 Python
wtfPython—Python中一组有趣微妙的代码【收藏】
Aug 31 Python
python pandas库的安装和创建
Jan 10 Python
ubuntu 18.04搭建python环境(pycharm+anaconda)
Jun 14 Python
django多个APP的urls设置方法(views重复问题解决)
Jul 19 Python
解决安装python3.7.4报错Can''t connect to HTTPS URL because the SSL module is not available
Jul 31 Python
如何在django中运行scrapy框架
Apr 22 Python
Python的历史与优缺点整理
May 26 Python
用sleep间隔进行python反爬虫的实例讲解
Nov 30 Python
JAVA SpringMVC实现自定义拦截器
Mar 16 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
在线增减.htpasswd内的用户
2006/10/09 PHP
PHP 面向对象 final类与final方法
2010/05/05 PHP
54个提高PHP程序运行效率的方法
2015/07/19 PHP
PHP url的pathinfo模式加载不同控制器的简单实现
2016/08/12 PHP
javascript开发技术大全-第1章javascript概述
2011/07/03 Javascript
初步认识JavaScript函数库jQuery
2015/06/18 Javascript
JS验证IP,子网掩码,网关和MAC的方法
2015/07/02 Javascript
原生js实现轮播图
2017/02/27 Javascript
react.js CMS 删除功能的实现方法
2017/04/17 Javascript
JavaScript该如何学习 怎样轻松学习JavaScript
2017/06/12 Javascript
nodejs操作mongodb的填删改查模块的制作及引入实例
2018/01/02 NodeJs
vue element-ui 绑定@keyup事件无效的解决方法
2018/03/09 Javascript
Angular 如何使用第三方库的方法
2018/04/18 Javascript
node实现的爬虫功能示例
2018/05/04 Javascript
JS实现获取数组中最大值或最小值功能示例
2019/03/02 Javascript
[01:30]我们共输赢 完美世界城市挑战赛开启全新赛季
2019/04/19 DOTA
Python使用scrapy采集时伪装成HTTP/1.1的方法
2015/04/08 Python
python3实现跳一跳点击跳跃
2018/01/08 Python
Python cookbook(数据结构与算法)将名称映射到序列元素中的方法
2018/03/22 Python
解决python web项目意外关闭,但占用端口的问题
2019/12/17 Python
基于Tensorflow读取MNIST数据集时网络超时的解决方式
2020/06/22 Python
Anaconda的安装与虚拟环境建立
2020/11/18 Python
Bose法国官网:购买耳机、扬声器、家庭影院、专业音响
2017/12/21 全球购物
后勤自我鉴定
2013/10/13 职场文书
施工资料员的岗位职责
2013/12/22 职场文书
乡镇交通安全实施方案
2014/03/29 职场文书
公司年会抽奖活动主持词
2014/03/31 职场文书
物流专业自荐信
2014/05/23 职场文书
2014年大学生党员评议表自我评价
2014/09/20 职场文书
党的群众路线教育实践活动方案
2014/10/31 职场文书
论群众路线学习笔记
2014/11/06 职场文书
先进个人总结范文
2015/02/15 职场文书
python 如何做一个识别率百分百的OCR
2021/05/29 Python
JPA 通过Specification如何实现复杂查询
2021/11/23 Java/Android
Python调用腾讯API实现人脸身份证比对功能
2022/04/04 Python
Golang 对es的操作实例
2022/04/20 Golang