博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python 回溯法 子集树模板 系列 —— 10、m着色问题
阅读量:7079 次
发布时间:2019-06-28

本文共 1039 字,大约阅读时间需要 3 分钟。

问题

图的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://yepml.baihongyu.com/

你可能感兴趣的文章
vim插件ctags的安装和使用【转】
查看>>
Debian静态IP地址和DNS
查看>>
Java中Class.this和this的区别(转)
查看>>
jsp参数传递
查看>>
nutch2.x在eclipse+windows环境下运行遇到的一些问题的解决方案
查看>>
.Net Core 2.0 EntityFrameworkCore CodeFirst入门教程
查看>>
"软件随想录" 读书笔记
查看>>
windows下,下载pip安装
查看>>
nginx反向代理中proxy_set_header 运维笔记
查看>>
jQuery操作元素的class属性
查看>>
关于idea新建子目录时往父目录名字后叠加而不是树形结构的解决方法(转)
查看>>
HttpURLConnection和HttpClient的区别2(转)
查看>>
GMP大法教你重新做人(从入门到实战)
查看>>
视频教程制作软件与制作方法
查看>>
数据结构与算法 - 图论
查看>>
时间系统、进程的调度与切换
查看>>
跨域详解
查看>>
数组是个好东西
查看>>
Android Studio 经常使用手冊
查看>>
【深度学习】吴恩达网易公开课练习(class2 week1)
查看>>