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笔记(叁)继续学习
Oct 24 Python
Django中使用group_by的方法
May 26 Python
Python基于二分查找实现求整数平方根的方法
May 12 Python
基于Django框架利用Ajax实现点赞功能实例代码
Aug 19 Python
python 运用Django 开发后台接口的实例
Dec 11 Python
Python拆分大型CSV文件代码实例
Oct 07 Python
Django异步任务线程池实现原理
Dec 17 Python
细数nn.BCELoss与nn.CrossEntropyLoss的区别
Feb 29 Python
在Python中使用K-Means聚类和PCA主成分分析进行图像压缩
Apr 10 Python
Python新手如何理解循环加载模块
May 29 Python
Python django框架 web端视频加密的实例详解
Nov 20 Python
只用50行Python代码爬取网络美女高清图片
Jun 02 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绘图之生成饼状图的方法
2015/01/24 PHP
PHP会话处理的10个函数
2015/08/11 PHP
Yii框架日志操作图文与实例详解
2019/09/09 PHP
多广告投放代码 推荐
2006/11/13 Javascript
document.documentElement && document.documentElement.scrollTop
2007/12/01 Javascript
cnblogs csdn 代码运行框实现代码
2009/11/02 Javascript
javascript转换字符串为dom对象(字符串动态创建dom)
2010/05/10 Javascript
js判断浏览器类型的方法
2013/08/07 Javascript
javascript中局部变量和全局变量的区别详解
2015/02/27 Javascript
javascript中this的四种用法
2015/05/11 Javascript
jQuery EasyUI Pagination实现分页的常用方法
2016/05/21 Javascript
基于Bootstrap实现图片轮播效果
2016/05/22 Javascript
深入浅析knockout源码分析之订阅
2016/07/12 Javascript
详解js树形控件—zTree使用总结
2016/12/28 Javascript
BOM之navigator对象和用户代理检测
2017/02/10 Javascript
简单好用的nodejs 爬虫框架分享
2017/03/26 NodeJs
JavaScript中立即执行函数实例详解
2017/11/04 Javascript
在node中使用jwt签发与验证token的方法
2019/04/03 Javascript
Python打印scrapy蜘蛛抓取树结构的方法
2015/04/08 Python
运行django项目指定IP和端口的方法
2018/05/14 Python
使用python判断你是青少年还是老年人
2018/11/29 Python
在python中对变量判断是否为None的三种方法总结
2019/01/23 Python
python里运用私有属性和方法总结
2019/07/08 Python
tensorflow 实现自定义梯度反向传播代码
2020/02/10 Python
canvas实现扭蛋机动画效果的示例代码
2018/10/17 HTML / CSS
美国南部最大的家族百货公司:Belk
2017/01/30 全球购物
Erwin Müller穆勒家居瑞士官网:您整个家庭的邮购公司
2019/12/28 全球购物
房地产项目建议书
2014/03/12 职场文书
社团活动总结怎么写
2014/06/30 职场文书
教师自查自纠工作情况报告
2014/10/29 职场文书
党的群众路线教育实践活动心得体会(乡镇)
2014/11/03 职场文书
2014年实验室工作总结
2014/12/03 职场文书
2015年新教师工作总结
2015/04/28 职场文书
Nginx设置日志打印post请求参数的方法
2021/03/31 Servers
sass 常用备忘案例详解
2021/09/15 HTML / CSS
Python中字符串对象语法分享
2022/02/24 Python