个人总结-----非贪心算法的图的m着色判断及优化问题
1.问题描述:
对于著名的图的m着色,有两个主要的问题,一个是图的m色判定问题,一个是图的m色优化问题,描述如下。
图的m色判定问题: 给定无向连通图G和m种颜色。用这些颜色为图G的各顶点着色.问是否存在着色方法,使得G中任2邻接点有不同颜色。
图的m色优化问题:给定无向连通图G,为图G的各顶点着色, 使图中任2邻接点着不同颜色,问最少需要几种颜色。所需的最少颜色的数目m称为该图的色数。
对于网上或书上的一些求解方式主要用贪心算法求解的方式,也有用回溯法的方式(一般不用,时空太大)。如这位博主 http://blog.csdn.net/pi9nc/article/details/9339199 使用的贪心算法来求解上面两个问题。
对于该问题的贪心算法求解方式,是十分直观、易懂,而且时空复杂度低。我个人的一种方式是非贪心算法的,采用的是一种 "扫描--判断--增加" 的方式来进行求解,算法的时空复杂度类似于贪心求解的过程,且,也十分的清晰易懂。
2.对于图的m优化问题求解过程&思路:"扫描--判断--增加"
a. 初始化:全局颜色变量 C = 0 ;代表当前整张图,可用的颜色数量有 C 种,即最大色数为 0 ;
b. 扫描: 对于V有n个顶点的无向连通图,从V0开始线性扫描每一个顶点。
c. 判断: 对于扫描到的顶点Vi,尝试使用 1 - C 的颜色(1 - C 代表每一种不同的颜色)去着Vi,并判断V0 - Vi-1 顶点中与Vi相邻的顶点是否有颜色冲突。若没有则着上该颜色。
d. 增加: 若对于当前扫描节点Vi,对于所有的 1 - C 的颜色都没办法着色。这时,就需要增加一种新的颜色,让C++。并对Vi 着上新C值的颜色。
e. 线性扫描结束。
3.对于图的m着色判断问题求解&思路
图的m着色判断与上面的优化问题几乎相似。只是开始的时候令颜色变量C = m 。当在 "判断" 这一步时,若无法给Vi着色,则给出不能着色的结论。若能线性扫描完毕,则给出m色能够着色的结论。
4.图的m着色的优化问题代码
下面给出个人的图的m着色的优化问题的C++代码。

#include<iostream>
#include<string.h> #define N 5
using namespace std; bool isCollsion(bool a[][N] ,int c[],int i , int clor);
int main(){
bool a[N][N] = {{false,true,true,true,false},{true,false,true,true,true},{true,true,false,true,false},{true,true,true,false,true},{false,true,false,true,false}};
int c[N];
memset(c,-1,N*sizeof(int)); int i = 0;
int cl = 1; //cl 为颜色库 颜色的编号从 [1 - cl] 之间选择,初始的颜色库中 只有 1 种颜色
int j = 0;
for(i = 0; i < N;++i){ //遍历每一个节点 vi
for(j = 1; j <= cl ;++j){ //对vi 节点尝试使用颜色 j来着色(1<= j <= cl)
if(!isCollsion(a,c,i,j)){ // 若vi 着颜色j ,且与已经着色的节点(v0 - v(i-1))不发生任何着色冲突的话,就将vi着色为j
c[i] = j;
break;
}
if(c[i] == -1){ //若颜色库中所有颜色都不能为vi节点 着色的话,就增加一种颜色,cl++;并将 该颜色赋予节点i
c[i] = ++cl;
}
}
} cout<<cl<<endl;;
return 0;
} //检查 若vi 着颜色j ,与已经着色的节点(v0 - v(i-1)) 是否连通且不发生任何颜色冲突的话,
bool isCollsion(bool a[][N] ,int c[],int i , int clor){
int j = 0;
for(; j < i ;++j){
if(a[i][j] && c[j] == clor)return true;
}
return false;
}
5.实验结果截图

6.总结
复习到这部分的内容后,尤其是图的几个重要算法,无不与贪心算法有关系。都是以局部最优达到全局最优。这里针对图的m着色问题本人的一个非贪心算法的示例,具有简单、易懂、时空低的特点。So...继续学习,daydayup。算法和数据结构是非常重要的基础。
参考资料
计算机算法设计与分析
http://blog.csdn.net/pi9nc/article/details/9339199
个人总结-----非贪心算法的图的m着色判断及优化问题的更多相关文章
- 正則表達式re中的贪心算法和非贪心算法 在python中的应用
之前写了一篇有关正則表達式的文章.主要是介绍了正則表達式中通配符 转义字符 字符集 选择符和子模式 可选项和反复子模式 字符串的開始和结尾 ,有兴趣的能够查看博客内容. 此文章主要内容将要介绍re中的 ...
- python正则表达式01--贪心算法和非贪心算法findall()
import re st = 'asdfasxxixxdafqewxxlovexxsadawexxyouxxas' # . #点匹配除换行符外的任意字符 a0 = re.findall('xx.',s ...
- 剑指Offer——贪心算法
剑指Offer--贪心算法 一.基本概念 所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解.虽然贪心算法不能对 ...
- 「面试高频」二叉搜索树&双指针&贪心 算法题指北
本文将覆盖 「字符串处理」 + 「动态规划」 方面的面试算法题,文中我将给出: 面试中的题目 解题的思路 特定问题的技巧和注意事项 考察的知识点及其概念 详细的代码和解析 开始之前,我们先看下会有哪些 ...
- Java 理论与实践: 非阻塞算法简介——看吧,没有锁定!(转载)
简介: Java™ 5.0 第一次让使用 Java 语言开发非阻塞算法成为可能,java.util.concurrent 包充分地利用了这个功能.非阻塞算法属于并发算法,它们可以安全地派生它们的线程, ...
- 贪心算法(Greedy Algorithm)之最小生成树 克鲁斯卡尔算法(Kruskal's algorithm)
克鲁斯卡尔算法(Kruskal's algorithm)是两个经典的最小生成树算法的较为简单理解的一个.这里面充分体现了贪心算法的精髓.大致的流程能够用一个图来表示.这里的图的选择借用了Wikiped ...
- 贪心算法(2)-Kruskal最小生成树
什么是最小生成树? 生成树是相对图来说的,一个图的生成树是一个树并把图的所有顶点连接在一起.一个图可以有许多不同的生成树.一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n ...
- 贪心算法:旅行商问题(TSP)
TSP问题(Traveling Salesman Problem,旅行商问题),由威廉哈密顿爵士和英国数学家克克曼T.P.Kirkman于19世纪初提出.问题描述如下: 有若干个城市,任何两个城市之间 ...
- Java 理论与实践: 非阻塞算法简介--转载
在不只一个线程访问一个互斥的变量时,所有线程都必须使用同步,否则就可能会发生一些非常糟糕的事情.Java 语言中主要的同步手段就是synchronized 关键字(也称为内在锁),它强制实行互斥,确保 ...
随机推荐
- 2013-7-28 802.11n帧聚合
芯片开发阶段的帧聚合迥异于商用AP,前者更偏向实现过程,后者偏向结果.也就是说用户在使用商用设备时不会管你特性是如何实现的,他们只关心效果,开启这个功能能否实实在在的提高AP的吞吐量. 网上搜索了众多 ...
- js阻止默认事件、拖拽等等
1.自定义右键菜单: <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> &l ...
- linux 查看文件夹下的文件个数(当前目录的文件数)//包含子目录
ls -l |grep "^-"|wc -l //验证了redhat好用 或 find ./company -type f | wc -l 查看某文件夹下文件的个数,包括子文件 ...
- [UE4]acotor放置4*4列表
// Number of blocks const int32 NumBlocks = Size * Size; // Loop to spawn each block ; BlockIndex< ...
- 深入理解yield(二):yield与协程
转自:http://blog.beginman.cn/blog/133/ 协程概念 1.并发编程的种类:多进程,多线程,异步,协程 2.进程,线程,协程的概念区别: 进程.线程和协程的理解 进程:拥有 ...
- spring boot 静态变量注入配置文件
spring 静态变量注入 spring 中不支持直接进行静态变量值的注入,我们看一下代码: @Component(value = "KafkaConfig") @Configur ...
- springboot根据不同的条件创建bean,动态创建bean,@Conditional注解使用
这个需求应该也比较常见,在不同的条件下创建不同的bean,具体场景很多,能看到这篇的肯定懂我的意思. 倘若不了解spring4.X新加入的@Conditional注解的话,要实现不同条件创建不同的be ...
- 关于 百度 Ueditor (在chrome浏览器) 上传图片时 打开文件夹的延迟问题
在使用 ueditor 开发时, 作为一个web文本编辑器使用时. 当点击上传图片时, 文件夹要延迟好久才能打开. 解决: 针对多图片上传, 将/ueditor/dialogs/image/image ...
- python装饰器(docorator)详解
引言: 装饰器是python面向对象编程三大器之一,另外两个迭代器.生成器只是我现在还没有遇到必须使用的场景,等确实需要用到的时候,在补充资料:装饰器在某些场景真的是必要的,比如定义了一个类或者一个函 ...
- Webservice 返回数据集 DataSet 及Android显示数据集LiveBindings
一.服务端 New TSoapDataModule 添加控件 TDataSetProvider,TClientDataSet,TADOQuery,TADOConnection 添加方法 functio ...