开发者社区> 吞吞吐吐的> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

python 回溯法 子集树模板 系列 —— 10、m着色问题

简介:
+关注继续查看

问题

图的m-着色判定问题

给定无向连通图G和m种不同的颜色。用这些颜色为图G的各顶点着色,每个顶点着一种颜色,是否有一种着色法使G中任意相邻的2个顶点着不同颜色?

图的m-着色优化问题

若一个图最少需要m种颜色才能使图中任意相邻的2个顶点着不同颜色,则称这个数m为该图的色数。求一个图的最小色数m的问题称为m-着色优化问题。

709432-20170601182940508-307128189.png

分析

解的长度是固定的,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开始

效果图

709432-20170601195114649-1966695735.jpg

本文转自罗兵博客园博客,原文链接:http://www.cnblogs.com/hhh5460/p/6930276.html,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
python 模板中的语法
python 模板中的语法
2667 0
从能做什么到如何去做,一文带你快速掌握Python编程基础与实战
Python语言的教程虽然随处可见,但是忙于日常业务/学习的你或许:一直想要“找个时间学一点”,但是又不知道该从何下手?本文将从Python能做什么,如何学习Python以及Python的基础知识为你的Python之路点上一盏明灯。
18332 0
Python学习(28)--tkinter图形界面编程1
Python学习(28)--tkinter图形界面编程1 这一节我们将介绍Python内置的图形界面编程模块tkinter,tkinter是Python标准的GUI编程接口,可以良好的运行在大多数的系统平台中,只需要安装好Python就可以导入tkinter模块并使用,无需安装第三方库。
1778 0
【韦玮Python分享合集】如何快速掌握Python编程基础实战?这里有你掌握Python编程世界的秘钥!
IT行业竞争激烈,淘汰迅速,随之而来的,是编程语言的不断迭代更新,程序员常有“长江后浪推前浪,前浪死在沙滩上”的感慨。然而,Python语言的教程虽然随处可见,但是忙于日常业务/学习的你或许:一直想要“找个时间学一点”,但是又不知道该从何下手?本文就让韦玮带你快速入门Python!
26005 0
编程大神一道题带你搞定Python函数中形参和实参问题
昨天在Python学习群里有位路人甲问了个Python函数中关于形参和实参一个很基础的问题,虽然很基础,但是对于很多小白来说不一定简单,反而会被搞得稀里糊涂。
1300 0
全栈Python 编程必备
版权声明:本文为半吊子子全栈工匠(wireless_com,同公众号)原创文章,未经允许不得转载。
1201 0
Hadoop编程调用HDFS(PYTHON)
1.运行环境 开发工具:PyCharm Python 版本:3.5 Hadoop环境: Cloudera QuickStart 2.GITHUB地址 https://github.com/nbfujx/hadoop-learn-demo/tree/master/python-hadoop-hdfs .
818 0
文章
问答
文章排行榜
最热
最新
相关电子书
更多
Python第五讲——关于爬虫如何做js逆向的思路
立即下载
Python系列直播第一讲——Python中的一切皆对象
立即下载
Python 脚本速查手册
立即下载