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实现从脚本里运行scrapy的方法
Apr 07 Python
使用Python解析JSON数据的基本方法
Oct 15 Python
Python编程实现蚁群算法详解
Nov 13 Python
Python 快速实现CLI 应用程序的脚手架
Dec 05 Python
关于Tensorflow中的tf.train.batch函数的使用
Apr 24 Python
Python操作配置文件ini的三种方法讲解
Feb 22 Python
python爬虫-模拟微博登录功能
Sep 12 Python
tensorflow实现tensor中满足某一条件的数值取出组成新的tensor
Jan 04 Python
Python基于当前时间批量创建文件
May 07 Python
python实现在线翻译
Jun 18 Python
python redis存入字典序列化存储教程
Jul 16 Python
用Python提取PDF表格的方法
Apr 11 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
VML绘图板②脚本--VMLgraph.js、XMLtool.js
2006/10/09 PHP
PHP 5.3.0 安装分析心得
2009/08/07 PHP
PHP输入流php://input实例讲解
2015/12/22 PHP
PHP判断数组是否为空的常用方法(五种方法)
2017/02/08 PHP
tp5(thinkPHP5)框架实现多数据库查询的方法
2019/01/10 PHP
JavaScript 获取用户客户端操作系统版本
2009/08/25 Javascript
dtree 网页树状菜单及传递对象集合到js内,动态生成节点
2012/04/14 Javascript
js简单实现删除记录时的提示效果
2013/12/05 Javascript
JS操作CSS随机改变网页背景实现思路
2014/03/10 Javascript
jQuery实现返回顶部功能
2016/02/23 Javascript
提高JavaScript执行效率的23个实用技巧
2017/03/01 Javascript
解析vue data不可以使用箭头函数问题
2018/07/03 Javascript
vue与django集成打包的实现方法
2019/11/11 Javascript
解决vue项目中页面调用数据 在数据加载完毕之前出现undefined问题
2019/11/14 Javascript
解决vue-router路由拦截造成死循环问题
2020/08/05 Javascript
在vue中使用console.log无效的解决
2020/08/09 Javascript
浅谈JavaScript 声明提升
2020/09/14 Javascript
[02:23]DOTA2英雄基础教程 幻影长矛手
2013/12/09 DOTA
Python制作Windows系统服务
2017/03/25 Python
Python机器学习之决策树算法
2017/12/22 Python
Python中if有多个条件处理方法
2020/02/26 Python
keras和tensorflow使用fit_generator 批次训练操作
2020/07/03 Python
五分钟带你搞懂python 迭代器与生成器
2020/08/30 Python
Python爬虫如何破解JS加密的Cookie
2020/11/19 Python
sort命令的作用和用法
2013/08/25 面试题
团委书记的竞聘演讲稿
2014/04/24 职场文书
团日活动总结范文
2014/04/25 职场文书
2014年会策划方案
2014/05/11 职场文书
2014年小学美术工作总结
2014/12/20 职场文书
先进单位申报材料
2014/12/25 职场文书
2015年社区统计工作总结
2015/04/21 职场文书
2016年寒假学习心得体会
2015/10/09 职场文书
2016党员学习《反对自由主义》心得体会
2016/01/22 职场文书
国产动画《万圣街》日语配音版制作决定!
2022/03/20 国漫
Linux磁盘管理方法介绍
2022/06/01 Servers
Fluentd搭建日志收集服务
2022/09/23 Servers