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  连接字符串(join %)
Sep 06 Python
详解Python多线程Selenium跨浏览器测试
Apr 01 Python
Python 多线程的实例详解
Sep 07 Python
pygame游戏之旅 载入小车图片、更新窗口
Nov 20 Python
python直接获取API传递回来的参数方法
Dec 17 Python
学习python分支结构
May 17 Python
python 实现检验33品种数据是否是正态分布
Dec 09 Python
详解使用python3.7配置开发钉钉群自定义机器人(2020年新版攻略)
Apr 01 Python
Python virtualenv虚拟环境实现过程解析
Apr 18 Python
python实现黄金分割法的示例代码
Apr 28 Python
高考要来啦!用Python爬取历年高考数据并分析
Jun 03 Python
Python列表的索引与切片
Apr 07 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二分查找算法示例【递归与非递归方法】
2016/09/29 PHP
php执行多个存储过程的方法【基于thinkPHP】
2016/11/08 PHP
Laravel学习教程之IOC容器的介绍与用例
2017/08/15 PHP
php中加密解密DES类的简单使用方法示例
2020/03/26 PHP
出现“不能执行已释放的Script代码”错误的原因及解决办法
2007/08/29 Javascript
通过event对象的fromElement属性解决热区设置主实体的一个bug
2008/12/22 Javascript
jquery处理页面弹出层查询数据等待操作实例
2015/03/25 Javascript
详解JavaScript中的表单验证
2015/06/16 Javascript
AnjularJS中$scope和$rootScope的区别小结
2016/09/18 Javascript
JS遍历ul下的li点击弹出li的索引的实现方法
2016/09/19 Javascript
NodeJs操作MongoDB教程之分页功能以及常见问题
2019/04/09 NodeJs
详解vue开发中调用微信jssdk的问题
2019/04/16 Javascript
js笔试题-接收get请求参数
2019/06/15 Javascript
layui prompt 设置允许空白提交的方法
2019/09/24 Javascript
卸载vue2.0并升级vue_cli3.0的实例讲解
2020/02/16 Javascript
详解react组件通讯方式(多种)
2020/05/06 Javascript
javascript canvas实现简易时钟例子
2020/09/05 Javascript
centos系统升级python 2.7.3
2014/07/03 Python
Python使用ntplib库同步校准当地时间的方法
2016/07/02 Python
利用Python实现命令行版的火车票查看器
2016/08/05 Python
Python之列表实现栈的工作功能
2019/01/28 Python
python网络编程之多线程同时接受和发送
2019/09/03 Python
解决pycharm不能自动补全第三方库的函数和属性问题
2020/03/12 Python
使用Filters滤镜弥补CSS3的跨浏览器问题以及兼容低版本IE
2013/01/23 HTML / CSS
会计应届生的自荐信
2013/12/13 职场文书
校园活动策划书范文
2014/01/10 职场文书
企业车辆管理制度
2014/01/24 职场文书
学生手册家长评语
2014/02/10 职场文书
元旦促销方案
2014/03/15 职场文书
工程负责人任命书
2014/06/06 职场文书
食品委托检验协议书范本
2014/09/12 职场文书
领导班子三严三实对照检查材料
2014/09/25 职场文书
2014年后备干部工作总结
2014/12/08 职场文书
自我评价优缺点范文
2015/03/11 职场文书
MongoDB数据库的安装步骤
2021/06/18 MongoDB
SQL实现LeetCode(197.上升温度)
2021/08/07 MySQL