Python基于回溯法子集树模板解决m着色问题示例


Posted in Python onSeptember 07, 2017

本文实例讲述了Python基于回溯法子集树模板解决m着色问题。分享给大家供大家参考,具体如下:

问题

图的m-着色判定问题

给定无向连通图G和m种不同的颜色。用这些颜色为图G的各顶点着色,每个顶点着一种颜色,是否有一种着色法使G中任意相邻的2个顶点着不同颜色?

图的m-着色优化问题

若一个图最少需要m种颜色才能使图中任意相邻的2个顶点着不同颜色,则称这个数m为该图的色数。求一个图的最小色数m的问题称为m-着色优化问题。

Python基于回溯法子集树模板解决m着色问题示例

分析

解的长度是固定的,n。若x为本问题的一个解,则x[i]表示第i个节点的涂色编号。

可以将m种颜色看作每个节点的状态空间。每到一个节点,遍历所有颜色,剪枝,回溯。

不难看出,可以套用回溯法子集树模板。

代码

'''图的m着色问题'''
# 用邻接表表示图
n = 5 # 节点数
a,b,c,d,e = range(n) # 节点名称
graph = [
  {b,c,d},
  {a,c,d,e},
  {a,b,d},
  {a,b,c,e},
  {b,d}
]
m = 4 # m种颜色
x = [0]*n # 一个解(n元数组,长度固定)注意:解x的下标就是a,b,c,d,e!!!
X = []   # 一组解
# 冲突检测
def conflict(k):
  global n,graph,x
  # 找出第k个节点前面已经涂色的邻接节点
  nodes = [node for node in range(k) if node in graph[k]]
  if x[k] in [x[node] for node in nodes]: # 已经有相邻节点涂了这种颜色
    return True
  return False # 无冲突
# 图的m着色(全部解)
def dfs(k): # 到达(解x的)第k个节点
  global n,m,graph,x,X
  if k == n: # 解的长度超出
    print(x)
    #X.append(x[:])
  else:
    for color in range(m): # 遍历节点k的可涂颜色编号(状态空间),全都一样
      x[k] = color
      if not conflict(k): # 剪枝
        dfs(k+1)
# 测试
dfs(a)  # 从节点a开始

效果图

Python基于回溯法子集树模板解决m着色问题示例

更多关于Python相关内容可查看本站专题:《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python sys.path详细介绍
Oct 17 Python
Python 多线程实例详解
Mar 25 Python
python数据结构之链表的实例讲解
Jul 25 Python
Python进阶之尾递归的用法实例
Jan 31 Python
对python Tkinter Text的用法详解
Oct 11 Python
Python os.rename() 重命名目录和文件的示例
Oct 25 Python
在python中将list分段并保存为array类型的方法
Jul 15 Python
Python如何调用外部系统命令
Aug 07 Python
解决python3 安装不了PIL的问题
Aug 16 Python
python3 tkinter实现添加图片和文本
Nov 26 Python
通过Turtle库在Python中绘制一个鼠年福鼠
Feb 03 Python
将python文件打包exe独立运行程序方法详解
Feb 12 Python
python中利用Future对象异步返回结果示例代码
Sep 07 #Python
python中利用Future对象回调别的函数示例代码
Sep 07 #Python
Python标准库之itertools库的使用方法
Sep 07 #Python
在Python的一段程序中如何使用多次事件循环详解
Sep 07 #Python
教你学会使用Python正则表达式
Sep 07 #Python
Python基础学习之常见的内建函数整理
Sep 06 #Python
Python升级导致yum、pip报错的解决方法
Sep 06 #Python
You might like
PHP中,文件上传
2006/12/06 PHP
PHP中开启gzip压缩的2种方法
2015/01/31 PHP
php实现将Session写入数据库
2015/07/26 PHP
php自动识别文字编码并转换为目标编码的方法
2015/08/08 PHP
WordPress中的shortcode短代码功能使用详解
2016/05/17 PHP
php实现的错误处理封装类实例
2017/06/20 PHP
基于prototype的validation.js发布2.3.4新版本,让你彻底脱离表单验证的烦恼
2006/12/06 Javascript
关于javascript中this关键字(翻译+自我理解)
2010/10/20 Javascript
js用Date对象处理时间实现思路及代码
2013/01/31 Javascript
JavaScript中使用Substring删除字符串最后一个字符
2013/11/03 Javascript
js常用数组操作方法简明总结
2014/06/20 Javascript
jQuery中noConflict()用法实例分析
2015/02/08 Javascript
jquery实现右侧栏菜单选择操作
2016/03/04 Javascript
简单了解JavaScript操作XPath的一些基本方法
2016/06/03 Javascript
AngularJS 中文API参考手册
2016/07/28 Javascript
Vue.js每天必学之计算属性computed与$watch
2016/09/05 Javascript
vue中监听路由参数的变化及方法
2019/12/06 Javascript
[42:32]VP vs RNG 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.21.mp4
2020/07/19 DOTA
Python3 入门教程 简单但比较不错
2009/11/29 Python
Python输出PowerPoint(ppt)文件中全部文字信息的方法
2015/04/28 Python
用matplotlib画等高线图详解
2017/12/14 Python
让Python脚本暂停执行的几种方法(小结)
2019/07/11 Python
30行Python代码实现高分辨率图像导航的方法
2020/05/22 Python
django前端页面下拉选择框默认值设置方式
2020/08/09 Python
全网最全python库selenium自动化使用详细教程
2021/01/12 Python
网络技术支持面试题
2013/04/22 面试题
导购员的岗位职责
2014/02/08 职场文书
《月迹》教学反思
2014/02/19 职场文书
最新大学生创业计划书写作攻略
2014/04/02 职场文书
爱心捐助倡议书
2014/05/19 职场文书
酒店员工培训方案
2014/06/02 职场文书
个人对照检查剖析材料
2014/10/13 职场文书
倡议书作文
2015/01/19 职场文书
工程质量保证书
2015/05/09 职场文书
导游词之无锡丝业博物馆
2019/11/12 职场文书
基于Python实现一个春节倒计时脚本
2022/01/22 Python