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 相关文章推荐
深入探究Django中的Session与Cookie
Jul 30 Python
Python复制Word内容并使用格式设字体与大小实例代码
Jan 22 Python
python梯度下降法的简单示例
Aug 31 Python
python实现K近邻回归,采用等权重和不等权重的方法
Jan 23 Python
不到20行代码用Python做一个智能聊天机器人
Apr 19 Python
Python实现语音识别和语音合成功能
Sep 20 Python
如何将 awk 脚本移植到 Python
Dec 09 Python
PyCharm使用Docker镜像搭建Python开发环境
Dec 26 Python
Tensorflow中的图(tf.Graph)和会话(tf.Session)的实现
Apr 22 Python
python判断正负数方式
Jun 03 Python
python thrift 实现 单端口多服务的过程
Jun 08 Python
Django中使用Celery的方法步骤
Dec 07 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删除文件夹的三种方法
2013/06/09 PHP
解决cPanel无法安装php5.2.17
2014/06/22 PHP
PHP嵌套输出缓冲代码实例
2015/05/12 PHP
[原创]php实现数组按拼音顺序排序的方法
2017/05/03 PHP
认识延迟时间为0的setTimeout
2008/05/16 Javascript
JavaScript Event学习第三章 早期的事件处理程序
2010/02/07 Javascript
JS按位非(~)运算符与~~运算符的理解分析
2011/07/31 Javascript
缓动函数requestAnimationFrame 更好的实现浏览器经动画
2012/12/07 Javascript
jquery对元素拖动排序示例
2014/01/16 Javascript
指定区域的图片自动按比例缩小的js代码(防止页面被图片撑破)
2014/02/21 Javascript
通过点击jqgrid表格弹出需要的表格数据
2015/12/02 Javascript
jQuery EasyUI常用数据验证汇总
2016/09/18 Javascript
解决URL地址中的中文乱码问题的办法
2017/02/10 Javascript
BootStrap Datetimepicker 汉化的实现代码
2017/02/10 Javascript
支持移动端原生js轮播图
2017/02/16 Javascript
对存在JavaScript隐式类型转换的四种情况的总结(必看篇)
2017/08/31 Javascript
Vue-router 类似Vuex实现组件化开发的示例
2017/09/15 Javascript
通过js动态创建标签,并设置属性方法
2018/02/24 Javascript
vue结合Echarts实现点击高亮效果的示例
2018/03/17 Javascript
详解Node.js一行命令上传本地文件到服务器
2019/04/22 Javascript
node.js实现上传文件功能
2019/07/15 Javascript
微信小程序完美解决scroll-view高度自适应问题的方法
2020/08/08 Javascript
浅谈Python实现2种文件复制的方法
2018/01/19 Python
python将回车作为输入内容的实例
2018/06/23 Python
小白入门篇使用Python搭建点击率预估模型
2018/10/12 Python
快速解决vue.js 模板和jinja 模板冲突的问题
2019/07/26 Python
Python定义一个Actor任务
2020/07/29 Python
物流仓储计划书
2014/01/10 职场文书
毕业自我鉴定怎么写
2014/03/25 职场文书
大学新生入学教育方案
2014/05/16 职场文书
学校政风行风评议工作总结
2014/10/21 职场文书
个人汇报材料范文
2014/12/30 职场文书
Golang 使用Map实现去重与set的功能操作
2021/04/29 Golang
Golang中interface{}转为数组的操作
2021/04/30 Golang
MySQL 覆盖索引的优点
2021/05/19 MySQL
PostgreSQL常用字符串分割函数整理汇总
2022/07/07 PostgreSQL