着色问题(回溯算法)
着色问题是很经典的一个问题,就是地图上的着色,首先有一个图用颜色着色,着色的要求就是任何的一条边,它的两个顶点是不能够才用同一个颜色的,要采用不同的颜色,图是无向的连通图(从一个顶点可以到达另外一个顶点,不存在过不去的情况),这里面的每一条边将两个顶点连起来,这个时候找所有的着色方案。
一、问题描述
输入:无向连通图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的研究。
着色问题(回溯算法)相关推荐
- java 着色问题 回溯算法,C语言使用回溯法解旅行售货员问题与图的m着色问题
旅行售货员问题 1.问题描述: 旅行售货员问题又称TSP问题,问题如下:某售货员要到若干个城市推销商品,已知各城市之间的路程(或旅费),他要选定一条从驻地出发,经过每个城市一遍最后回到驻地的路线,使总 ...
- 算法 64式 4、回溯算法整理__第1部分_1到13题
1算法思想 回溯 1.1含义 以深度优先方式搜索问题解的算法称为回溯法. 1.2思想 按照深度优先搜索策略,从根节点出发搜索解空间树,如果某结点不包含问题解,则逐层向祖先结点回溯:否则进入子树. 1. ...
- 【图的着色问题】算法设计与分析实验1
计算机科学与工程学院实验报告 课程名称 算法设计与分析 班级 实验内容 实验1:图的着色问题 指导教师 姓名 重剑DS 学号 实验日期 2022.04.28 一.问题描述,含输入.输出数据内容.格式 ...
- 图的m着色问题——回溯法及其优化(变量排序MRV, 值排序MCV, 前向检查ForwardChecking, 智能回溯, 边相容,K阶相容)python C++实现
文章目录 图的m着色问题背景 背景知识 问题描述 回溯法的原理及其实现 回溯法基本思想 朴素回溯法解决图的m着色问题 回溯优化策略 回溯法优化--变量排序MRV 回溯法优化--值排序MCV 回溯法优化 ...
- [回溯算法] 五大常用算法之回溯法
算法入门6:回溯法 一. 回溯法 – 深度优先搜素 1. 简单概述 回溯法思路的简单描述是:把问题的解空间转化成了图或者树的结构表示,然后使用深度优先搜索策略进行遍历,遍历的过程中记录和寻找所有可行解 ...
- 算法整理八——回溯算法
目录 一.概述 二.素数环问题 三.n个数中取出任意r个数进行排列 四.整数划分问题/自然数拆分(递归方法也可以实现,见递归部分) 五.装载问题(最大装载量) 六.0-1背包问题 七.n皇后问题 八. ...
- 通用解题法——回溯算法(理解+练习)
积累算法经验,积累解题方法--回溯算法,你必须要掌握的解题方法! 什么是回溯算法呢? 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就&quo ...
- 用栈、回溯算法设计迷宫程序
目录 1.走迷宫与回溯算法 2.迷宫设计栈扮演的角色 3.Python实现走迷宫 栈的应用有许多,本篇博文着重将栈与回溯(Backtracking)算法结合,设计走迷宫程序.其实回溯算法也是人工智能的 ...
- 数字拆分问题算法回溯_回溯算法:求子集问题!
给「代码随想录」一个星标吧! ❝ 认识本质之后,这就是一道模板题 通知:我将公众号文章和学习相关的资料整理到了Github :https://github.com/youngyangyang04/le ...
最新文章
- 优先队列 堆实现 java
- 工控攻防演示——从外网到内网控制系统设备的入侵
- Java垃圾回收总结
- VMware 6.5下载地址及序列号(转,备用)
- C#LeetCode刷题之#258-各位相加(Add Digits)
- mysql导入库指令_mysql数据库指令导入导出
- 软件开发高手须掌握的4大SQL精髓语句(综合篇)
- 中兴 108 亿换得自由身!
- Java并发编程:并发容器之ConcurrentHashMap(转载)
- Redis的过滤器(SCAN)功能
- Java实现定时任务
- win10电脑系统里的视频不显示缩略图
- 1.用 perf report 分析四个for进程
- mysql多表条件查询_mysql 多表 多个条件 查询
- 渣本毕业两年经验,大厂内部资料
- 解决canvas导出图片模糊问题
- 计算机图形图像知识梳理,计算机图形学知识点总结
- 如何强制修改电脑密码
- stm32f103电子钟心得体会_STM32中的时钟
- “Cache-主存”和“主存和辅存”的区别
热门文章
- 异常恶毒的十二星座性格分析(转)
- 基于卷积神经网络和小波变换的视频监控中的火灾探测
- DEEPIN 设置U盘启动
- 债券收益率预测模型_ARIMA模型在中国移动债券收益预测中的应用
- 想准确识别各地方言?这套15000小时方言语音数据推荐了解一下
- 商业智能BI的前景如何?看完这篇文章你就明白了
- 浏览器被360劫持解决办法
- python 降序排列
- c语言找出最大值和最小值并按降序排输出,C语言用排序法给十个数降序排列,用C语言编写,输入10个数按降序排列...
- 软件测试的功能测试和性能测试,软件测试中的功能测试和性能测试