个人总结-----非贪心算法的图的m着色判断及优化问题
2016-05-11 08:52
357 查看
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[] ,int c[],int i , int clor); int main(){ bool a = {{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 ; 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[] ,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
相关文章推荐
- setup pip, PyMySQL,Jupyter in python 3.3
- TextView属性大全(留着备用)
- LVS+Keepalived高可用负载均衡集群架构实验(参考)
- SQL如何删除表中空记录
- shiro中successUrl不起作用的问题
- 第一篇:速卖通产品采集系列 之 产品采集分析
- 菜单
- .Net技术
- RSA2016安全大会召开
- iOS FMDB的使用(增,删,改,查,sqlite存取图片)
- oracle plsql 无法连接 报 ORA-12560: TNS:protocol adapter error
- HorizontalScrollView嵌套在ListView,实现从右向左滑动单个删除,当滑动出来后,解决HorizontalScrollView被ListView回收+多个删除
- C++中的重载
- 顾广华白细胞图像的自动分割算法的相关改进
- 互联网如何颠覆这些我们熟知的17个行业!
- 信号与系统1:引言
- 【BZOJ-2892&1171】强袭作战&大sz的游戏 权值线段树+单调队列+标记永久化+DP
- 转:Struts2<s:iterator value="" var="lst">中var的使用和一些标签的使用体会
- 转 数据库中的 date datetime timestamp的区别
- 采用Tornado作为Web Server 运行第三方Web框架