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 相关文章推荐
特征脸(Eigenface)理论基础之PCA主成分分析法
Mar 13 Python
Python文件监听工具pyinotify与watchdog实例
Oct 15 Python
python调用百度地图WEB服务API获取地点对应坐标值
Jan 16 Python
PyQT实现菜单中的复制,全选和清空的功能的方法
Jun 17 Python
python发qq消息轰炸虐狗好友思路详解(完整代码)
Feb 15 Python
opencv-python的RGB与BGR互转方式
Jun 02 Python
python不同系统中打开方法
Jun 23 Python
Pythonic版二分查找实现过程原理解析
Aug 11 Python
python 将列表里的字典元素合并为一个字典实例
Sep 01 Python
python opencv实现直线检测并测出倾斜角度(附源码+注释)
Dec 31 Python
python实现语音常用度量方法的代码详解
May 25 Python
python 进阶学习之python装饰器小结
Sep 04 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
判“新”函数:得到今天与明天的秒数
2006/10/09 PHP
PHP 批量更新网页内容实现代码
2010/01/05 PHP
php数组函数序列之next() - 移动数组内部指针到下一个元素的位置,并返回该元素值
2011/10/31 PHP
PHP实现WebService的简单示例和实现步骤
2015/03/27 PHP
微信公众平台之快递查询功能用法实例
2015/04/14 PHP
Prototype ObjectRange对象学习
2009/07/19 Javascript
JS中数组Array的用法示例介绍
2014/02/20 Javascript
js实现点击图片将图片地址复制到粘贴板的方法
2015/02/16 Javascript
jquery实现全选功能效果的实现代码
2016/05/05 Javascript
JS排序算法之冒泡排序,选择排序与插入排序实例分析
2017/12/13 Javascript
vue中如何使用ztree
2018/02/06 Javascript
基于React+Redux的SSR实现方法
2018/07/03 Javascript
webpack4打包vue前端多页面项目
2018/09/17 Javascript
ng-repeat指令在迭代对象时的去重方法
2018/10/02 Javascript
JavaScript中的null和undefined用法解析
2019/09/30 Javascript
构建大型 Vue.js 项目的10条建议(小结)
2019/11/14 Javascript
axios封装与传参示例详解
2020/10/18 Javascript
[05:29]2014DOTA2国际邀请赛 赛后专访:LGDNewbee顺利过关
2014/07/13 DOTA
python模块restful使用方法实例
2013/12/10 Python
Python 多线程Threading初学教程
2017/08/22 Python
浅谈python numpy中nonzero()的用法
2018/04/02 Python
python3+PyQt5使用数据库窗口视图
2018/04/24 Python
Python使用wget实现下载网络文件功能示例
2018/05/31 Python
Python网络爬虫之爬取微博热搜
2019/04/18 Python
通过python连接Linux命令行代码实例
2020/02/18 Python
python+opencv边缘提取与各函数参数解析
2020/03/09 Python
浅析Python 抽象工厂模式的优缺点
2020/07/13 Python
沙龙级头发造型工具:FOXYBAE
2018/07/01 全球购物
俄罗斯香水和化妆品网上商店:NOTINO.ru
2019/12/17 全球购物
C语言编程题
2015/03/09 面试题
幼儿园教师工作感言
2014/02/15 职场文书
教师节活动主持词
2014/04/02 职场文书
2014年资料员工作总结
2014/11/18 职场文书
2016年小学教师政治学习心得体会
2016/01/23 职场文书
漫改真人电影「萌系男友是燃燃的橘色」公开先导视觉图
2022/03/21 日漫
mysql如何查询连续记录
2022/05/11 MySQL