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的Flask框架下收发电子邮件的教程
Apr 21 Python
Python3字符串学习教程
Aug 20 Python
Python实现列表删除重复元素的三种常用方法分析
Nov 24 Python
Python将多个excel表格合并为一个表格
Feb 22 Python
Sanic框架流式传输操作示例
Jul 18 Python
python调用java的jar包方法
Dec 15 Python
如何爬取通过ajax加载数据的网站
Aug 15 Python
django框架单表操作之增删改实例分析
Dec 16 Python
TensorFlow实现打印每一层的输出
Jan 21 Python
python实现在线翻译
Jun 18 Python
利用PyQt5+Matplotlib 绘制静态/动态图的实现代码
Jul 13 Python
快速创建python 虚拟环境
Nov 28 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
安健A254立体声随身听的分析与打磨
2021/03/02 无线电
PHP和Mysqlweb应用开发核心技术 第1部分 Php基础-3 代码组织和重用2
2011/07/03 PHP
laravel数据库查询结果自动转数组修改实例
2021/02/27 PHP
firefox浏览器下javascript 拖动层效果与原理分析代码
2007/12/04 Javascript
JS支持带x身份证号码验证函数
2008/08/10 Javascript
javascript OFFICE控件测试代码
2009/12/08 Javascript
Javascript面向对象之四 继承
2011/02/08 Javascript
在JavaScript里嵌入大量字符串常量的实现方法
2013/07/07 Javascript
原始的js代码和jquery对比体会
2013/09/10 Javascript
jquery选择器排除某个DOM元素的方法(实例演示)
2014/04/25 Javascript
Javascript让DEDECMS告别手写Tag
2014/09/01 Javascript
javascript中CheckBox全选终极方案
2015/05/20 Javascript
深入学习js瀑布流布局
2016/10/14 Javascript
JavaScript实现星级评分
2017/01/12 Javascript
微信小程序canvas写字板效果及实例
2017/06/15 Javascript
深入理解Vue.js源码之事件机制
2017/09/27 Javascript
Vue 项目部署到服务器的问题解决方法
2017/12/05 Javascript
Vue是怎么渲染template内的标签内容的
2020/06/05 Javascript
vant实现购物车功能
2020/06/29 Javascript
vue+elementUI动态增加表单项并添加验证的代码详解
2020/12/17 Vue.js
[48:31]完美世界DOTA2联赛PWL S3 DLG vs Phoenix 第二场 12.17
2020/12/19 DOTA
简单介绍Python的Tornado框架中的协程异步实现原理
2015/04/23 Python
python数组过滤实现方法
2015/07/27 Python
Python 遍历子文件和所有子文件夹的代码实例
2016/12/21 Python
python logging日志模块的详解
2017/10/29 Python
Python获取当前函数名称方法实例分享
2018/01/18 Python
python的sys.path模块路径添加方式
2020/03/09 Python
怎样客观的做好自我评价
2013/12/28 职场文书
政法学院毕业生求职信
2014/02/28 职场文书
应急处置方案
2014/06/16 职场文书
七夕相亲活动策划方案
2014/08/31 职场文书
建设工程授权委托书
2014/09/22 职场文书
带香烟到学校抽的检讨书
2014/09/25 职场文书
2014年社区宣传工作总结
2014/12/02 职场文书
SQLServer 错误: 15404,无法获取有关 Windows NT 组/用户 WIN-8IVSNAQS8T7\Administrator 的信息
2021/06/30 SQL Server
高并发下Redis如何保持数据一致性(避免读后写)
2022/03/18 Redis