着色问题是很经典的一个问题,就是地图上的着色,首先有一个图用颜色着色,着色的要求就是任何的一条边,它的两个顶点是不能够才用同一个颜色的,要采用不同的颜色,图是无向的连通图(从一个顶点可以到达另外一个顶点,不存在过不去的情况),这里面的每一条边将两个顶点连起来,这个时候找所有的着色方案。

一、问题描述

输入:无向连通图G和m 种颜色的集合用这些颜色给图的顶点着色,每个顶点一种颜色. 要求是:G 的每条边的两个顶点着不同颜色.

输出:所有可能的着色方案。 如果不存在着色方案,回答“No”

二、实例

左边是有7个顶点的连通图,现在有三种颜色能将每个顶点涂上不同的颜色,第1个顶点涂成红色,第2个顶点涂成蓝色,……任何一条边两端的颜色都不一样,这就是一个着色方案。

n=7, m=3

三、解向量

回溯算法第一步就是研究解,这个解其实是一个向量,因为每个顶点都要着色,所以它是一个跟顶点个数相同的一个向量。

设G=(V,E),V={1,2, … , n}

1、颜色编号:1, 2, … , m

2、解向量:

<x1,x2,...,xn>,x1,x2,…,xn∈1,2,..,m<x1, x2, ..., xn>, x1, x2, …, xn∈{1,2, .., m }<x1,x2,...,xn>,x1,x2,…,xn∈1,2,..,m
结点的部分向量<x1,x2,…,xk>x1,x2,…,xk,1≤k≤n,<x1, x2 , … , xk> x1, x2, …, xk, 1 ≤k ≤n,<x1,x2,…,xk>x1,x2,…,xk,1≤k≤n,
表示只给顶点1,2,…,k着色的部分方案

四、算法设计

1、搜索树:m叉树

向量的每一个分量上赋一种颜色编号,颜色编号的可选集合在m中去选择,编号每个分量的范围是1…m,要求的向量的长度是n,最后要求得的是m叉树,每个顶点可能有m中选择,这个顶点着完色以后就对它的下一个顶点进行着色,下一个顶点着色的时候,有m-1种选择,这样继续遍历,直到找到一条路径能够到达叶结点。

也就是说,对所有的顶点都找到一个着色的方案,达到最后找到一个路径,每个路径的顶点都找到一个着色的方案,每个路径的上面都有编号,把这些编号连接起来就是着色方案。

2、约束条件

在结点<x1, x2, … , xk>处,顶点k+1 的邻接表中结点已用过的颜色不能再用
如果邻接表中结点已用过m种颜色,则结点k+1没法着色,从该结点回溯到其父结点, 满足多米诺性质

注:
在着色的时候需要记录这个点的邻接点,从上面往下遍历,一种可能:走到一个点和它相连的一些点很可能已经有颜色了(着过色了),着过色的这些点里面的颜色总数已经有m种了,那么对它而言没有办法再着色了

另外一种可能,前面和它相连的点已经有m-1种颜色,那这个点就只有一种选择。唯一的一种选择去放进去,再往下搜索观察和它相临的那些点的着色。

3、搜索策略

深度优先

4、时间复杂度

O(nmn)O(n m^n) O(nmn)

五、总结

在NP完全性角度,着色问题、装载问题是判定问题,0-1背包或者完全背包问题,装的总value达到最大越好,在活动的安排上,一个接一个,安排的最大的相容集,尽可能满足大部分人的需要,一些活动安排妥当,使得各个客户得到满足,一类问题是回答yes or no的问题,另外一类问题就是能不能找到最大的装入背包的物品的价值,能不能找到最大的安排的序列,满足最大的客户的需要,这是两种不同的回答,所有的优化问题是可以转化为判定问题的,

背包问题可以设定一系列的阈值,将阈值设定为100,有没有可能有一种装法让最终的总价值超过100,回答yes or no,超过了100有没有可能有一种装法让最终的总价值超过200,回答yes or no,超过了200有没有可能有一种装法让最终的总价值超过300,回答yes or no,…不停的设阈值,直到回答no,然后在把阈值向下减。最后只要回答yes or no,就能猜到心中的那个数,这种优化问题经过设置不同的阈值是可以装花城判定问题的。判定问题的输出只有0和1,回答yes or no。

研究单独的问题的时候,就像泛函中学的,从算法复杂性的角度来看,从问题角度哪些问题可以归为一类,然后再从更高层面来研究问题本身的属性,这就是NP的研究。

着色问题(回溯算法)相关推荐

  1. java 着色问题 回溯算法,C语言使用回溯法解旅行售货员问题与图的m着色问题

    旅行售货员问题 1.问题描述: 旅行售货员问题又称TSP问题,问题如下:某售货员要到若干个城市推销商品,已知各城市之间的路程(或旅费),他要选定一条从驻地出发,经过每个城市一遍最后回到驻地的路线,使总 ...

  2. 算法 64式 4、回溯算法整理__第1部分_1到13题

    1算法思想 回溯 1.1含义 以深度优先方式搜索问题解的算法称为回溯法. 1.2思想 按照深度优先搜索策略,从根节点出发搜索解空间树,如果某结点不包含问题解,则逐层向祖先结点回溯:否则进入子树. 1. ...

  3. 【图的着色问题】算法设计与分析实验1

    计算机科学与工程学院实验报告 课程名称 算法设计与分析 班级 实验内容 实验1:图的着色问题 指导教师 姓名 重剑DS 学号 实验日期 2022.04.28 一.问题描述,含输入.输出数据内容.格式 ...

  4. 图的m着色问题——回溯法及其优化(变量排序MRV, 值排序MCV, 前向检查ForwardChecking, 智能回溯, 边相容,K阶相容)python C++实现

    文章目录 图的m着色问题背景 背景知识 问题描述 回溯法的原理及其实现 回溯法基本思想 朴素回溯法解决图的m着色问题 回溯优化策略 回溯法优化--变量排序MRV 回溯法优化--值排序MCV 回溯法优化 ...

  5. [回溯算法] 五大常用算法之回溯法

    算法入门6:回溯法 一. 回溯法 – 深度优先搜素 1. 简单概述 回溯法思路的简单描述是:把问题的解空间转化成了图或者树的结构表示,然后使用深度优先搜索策略进行遍历,遍历的过程中记录和寻找所有可行解 ...

  6. 算法整理八——回溯算法

    目录 一.概述 二.素数环问题 三.n个数中取出任意r个数进行排列 四.整数划分问题/自然数拆分(递归方法也可以实现,见递归部分) 五.装载问题(最大装载量) 六.0-1背包问题 七.n皇后问题 八. ...

  7. 通用解题法——回溯算法(理解+练习)

    积累算法经验,积累解题方法--回溯算法,你必须要掌握的解题方法! 什么是回溯算法呢? 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就&quo ...

  8. 用栈、回溯算法设计迷宫程序

    目录 1.走迷宫与回溯算法 2.迷宫设计栈扮演的角色 3.Python实现走迷宫 栈的应用有许多,本篇博文着重将栈与回溯(Backtracking)算法结合,设计走迷宫程序.其实回溯算法也是人工智能的 ...

  9. 数字拆分问题算法回溯_回溯算法:求子集问题!

    给「代码随想录」一个星标吧! ❝ 认识本质之后,这就是一道模板题 通知:我将公众号文章和学习相关的资料整理到了Github :https://github.com/youngyangyang04/le ...

最新文章

  1. 优先队列 堆实现 java
  2. 工控攻防演示——从外网到内网控制系统设备的入侵
  3. Java垃圾回收总结
  4. VMware 6.5下载地址及序列号(转,备用)
  5. C#LeetCode刷题之#258-各位相加(Add Digits)
  6. mysql导入库指令_mysql数据库指令导入导出
  7. 软件开发高手须掌握的4大SQL精髓语句(综合篇)
  8. 中兴 108 亿换得自由身!
  9. Java并发编程:并发容器之ConcurrentHashMap(转载)
  10. Redis的过滤器(SCAN)功能
  11. Java实现定时任务
  12. win10电脑系统里的视频不显示缩略图
  13. 1.用 perf report 分析四个for进程
  14. mysql多表条件查询_mysql 多表 多个条件 查询
  15. 渣本毕业两年经验,大厂内部资料
  16. 解决canvas导出图片模糊问题
  17. 计算机图形图像知识梳理,计算机图形学知识点总结
  18. 如何强制修改电脑密码
  19. stm32f103电子钟心得体会_STM32中的时钟
  20. “Cache-主存”和“主存和辅存”的区别

热门文章

  1. 异常恶毒的十二星座性格分析(转)
  2. 基于卷积神经网络和小波变换的视频监控中的火灾探测
  3. DEEPIN 设置U盘启动
  4. 债券收益率预测模型_ARIMA模型在中国移动债券收益预测中的应用
  5. 想准确识别各地方言?这套15000小时方言语音数据推荐了解一下
  6. 商业智能BI的前景如何?看完这篇文章你就明白了
  7. 浏览器被360劫持解决办法
  8. python 降序排列
  9. c语言找出最大值和最小值并按降序排输出,C语言用排序法给十个数降序排列,用C语言编写,输入10个数按降序排列...
  10. 软件测试的功能测试和性能测试,软件测试中的功能测试和性能测试