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 BeautifulSoup使用方法详解
Nov 21 Python
python进阶教程之异常处理
Aug 30 Python
Python自动化测试ConfigParser模块读写配置文件
Aug 15 Python
Python与R语言的简要对比
Nov 14 Python
python实现批量解析邮件并下载附件
Jun 19 Python
Python3批量生成带logo的二维码方法
Jun 24 Python
django中使用事务及接入支付宝支付功能
Sep 15 Python
Python 过滤错误log并导出的实例
Dec 26 Python
Python3交互式shell ipython3安装及使用详解
Jul 11 Python
Python中Selenium库使用教程详解
Jul 23 Python
Python:__eq__和__str__函数的使用示例
Sep 26 Python
Python实现查询剪贴板自动匹配信息的思路详解
Jul 09 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和ACCESS写聊天室(七)
2006/10/09 PHP
mayfish 数据入库验证代码
2010/04/30 PHP
三种php连接access数据库方法
2013/11/11 PHP
phpmyadmin打开很慢的解决方法
2014/04/21 PHP
Symfony模板的快捷变量用法实例
2016/03/17 PHP
ThinkPHP项目分组配置方法分析
2016/03/23 PHP
php ci 获取表单中多个同名input元素值的代码
2016/03/25 PHP
php+ajax注册实时验证功能
2016/07/20 PHP
php中html_entity_decode实现HTML实体转义
2018/06/13 PHP
基于JQuery框架的AJAX实例代码
2009/11/03 Javascript
javascript利用初始化数据装配模版的实现代码
2010/11/17 Javascript
同一页面多个商品倒计时JS 基于面向对象的javascript
2012/02/16 Javascript
javascript基础知识大全 便于大家学习,也便于我自己查看
2012/08/17 Javascript
js 高效去除数组重复元素示例代码
2013/12/19 Javascript
jquery实现文本框数量加减功能的例子分享
2014/05/10 Javascript
一个JavaScript去除字符串末尾的空白实例代码
2014/09/22 Javascript
Windows系统下Node.js的简单入门教程
2015/06/23 Javascript
基于d3.js实现实时刷新的折线图
2016/08/03 Javascript
javascript如何创建对象
2016/08/29 Javascript
bootstrap与Jquery UI 按钮样式冲突的解决办法
2016/09/23 Javascript
快速解决js开发下拉框中blur与click冲突
2016/10/10 Javascript
详述 Sublime Text 打开 GBK 格式中文乱码的解决方法
2017/10/26 Javascript
JavaScript中this关键字用法实例分析
2018/08/24 Javascript
webpack css加载和图片加载的方法示例
2018/09/11 Javascript
Vue Extends 扩展选项用法完整实例
2019/09/17 Javascript
Python代码的打包与发布详解
2014/07/30 Python
Django+JS 实现点击头像即可更改头像的方法示例
2018/12/26 Python
python实现整数的二进制循环移位
2019/03/08 Python
详解PyCharm安装MicroPython插件的教程
2019/06/24 Python
解决selenium+Headless Chrome实现不弹出浏览器自动化登录的问题
2021/01/09 Python
五五普法心得体会
2014/09/04 职场文书
2014年高数考试作弊检讨书
2014/12/14 职场文书
建议书格式
2015/02/04 职场文书
学雷锋活动简报
2015/07/20 职场文书
六年级数学教学反思
2016/02/16 职场文书
HTML5中 rem适配方案与 viewport 适配问题详解
2021/04/27 HTML / CSS