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图像处理之反色实现方法
May 30 Python
栈和队列数据结构的基本概念及其相关的Python实现
Aug 24 Python
全面了解Python的getattr(),setattr(),delattr(),hasattr()
Jun 14 Python
获取Django项目的全部url方法详解
Oct 26 Python
Python2.7下安装Scrapy框架步骤教程
Dec 22 Python
pandas 读取各种格式文件的方法
Jun 22 Python
python使用ddt过程中遇到的问题及解决方案【推荐】
Oct 29 Python
在PyCharm中三步完成PyPy解释器的配置的方法
Oct 29 Python
python腾讯语音合成实现过程解析
Aug 01 Python
python自动循环定时开关机(非重启)测试
Aug 26 Python
Django实现whoosh搜索引擎使用jieba分词
Apr 08 Python
浅析python 通⽤爬⾍和聚焦爬⾍
Sep 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
迅雷下载《中学科技》怀旧期刊下载
2021/02/27 无线电
图书管理程序(三)
2006/10/09 PHP
CI(CodeIgniter)框架中的增删改查操作
2014/06/10 PHP
国产PHP开发框架myqee新手快速入门教程
2014/07/14 PHP
php常用的安全过滤函数集锦
2014/10/09 PHP
WordPress中使主题支持小工具以及添加插件启用函数
2015/12/22 PHP
PHP7中I/O模型内核剖析详解
2019/04/14 PHP
JavaScript返回网页中超链接数量的方法
2015/04/03 Javascript
jQuery焦点图插件SaySlide
2015/12/21 Javascript
javascript类型系统 Window对象学习笔记
2016/01/07 Javascript
Javascript简写条件语句(推荐)
2016/06/12 Javascript
Node.js读写文件之批量替换图片的实现方法
2016/09/07 Javascript
详解JS几种变量交换方式以及性能分析对比
2016/11/25 Javascript
实例浅析js的this
2016/12/11 Javascript
基于jQuery实现的查看全文功能【实用】
2016/12/11 Javascript
ES6新特性之字符串的扩展实例分析
2017/04/01 Javascript
JS实现数组按升序及降序排列的方法
2017/04/26 Javascript
解决Angular.js中使用Swiper插件不能滑动的问题
2018/02/26 Javascript
Vue render深入开发讲解
2018/04/13 Javascript
Vue下路由History模式打包后页面空白的解决方法
2018/06/29 Javascript
vue完成项目后,打包成静态文件的方法
2018/09/03 Javascript
vue自定义底部导航栏Tabbar的实现代码
2018/09/03 Javascript
angular6 填坑之sdk的方法
2018/12/27 Javascript
使用JS判断页面是首次被加载还是刷新
2019/05/26 Javascript
python删除列表内容
2015/08/04 Python
django js实现部分页面刷新的示例代码
2018/05/28 Python
详解django的serializer序列化model几种方法
2018/10/16 Python
python 伯努利分布详解
2020/02/25 Python
Python 实现集合Set的示例
2020/12/21 Python
Lentiamo丹麦:购买便宜的隐形眼镜
2021/01/13 全球购物
js正则匹配markdown里的图片标签的实现
2021/03/24 Javascript
建筑工程毕业生自我鉴定
2014/01/14 职场文书
国际贸易毕业生求职信
2014/07/20 职场文书
工作年限证明模板
2015/06/15 职场文书
Golang解析JSON对象
2022/04/30 Golang
mysql 获取相邻数据项
2022/05/11 MySQL