图的着色问题
chap12 图的着色

点着色的应用
课程安排问题 某大学数学系要为这个夏季安排课程表。所要开设 的课程为:图论(GT), 统计学(S),线性代数(LA), 高等 微积分(AC), 几何学(G)和近世代数(MA)。现有10名 学生(如下所示)需要选修这些课程。根据这些信息, 确定开设这些课程所需要的最少时间段数,使得学 生选课不会发生冲突。(学生用Ai表示)
5
K可着色的图例
v1
1
v2
G
v3 v4
v5
2 3
S
:V(G) →S,满射 是正常3着色,G是3可着色的。
6
K色图
定义12.1.2 图G的正常k着色中最小的k称为G的色
数,记为(G),即(G)=min{k|G存在正常k着色}。
若(G) =k,则称G是k色图。 显然,含环的图不存在正常着色,而多重边与一条 边对正常着色是等价的。以后总设G为简单图。 问题:已知一个图G(p,q),如何求色数(G)?
又因k>0, 所以与(G)定义矛盾。结论成立。 注意此定理与定理12.1.2的区别。 定理12.1.2 若G是一个临界图,则(G) ≤(G)+1
21
Brooks 定理
定理12.1.5 若连通图G既不是奇回路,也不是完全 图,则(G) (G) . 例如,对Petersen图应用Brooks定理,可得: (G) (G) =3 . 此定理说明只有奇回路 或完全图这两类图的色 数才是(G) +1。
第一步:建图。 把每门课程做为图G的顶点,两顶点连线当且仅当 有某个学生同时选了这两门课程。
色给同一时 段的课程顶点染色,那么,问 题转化为在状态图中求点色数 问题。
MA
S
G
AC 选课状态图
LA
图的着色问题--C++实现(含详细注释)

图的着色问题一、题目简述(1) 图的m-着色判定问题给定一个无向连通图 G 和 m 种不同的颜色。
用这些颜色为图 G 的各顶点着色,每个顶点着一种颜色,是否有一种着色法使 G 中任意相邻的两个顶点着不同颜色?(2) 图的m-着色优化问题若一个图最少需要 m 种颜色才能使图中任意相邻的两个顶点着不同颜色,则称这个数 m 为该图的色数。
求一个图的最小色数 m 的问题称为m-着色优化问题。
二、算法思想1. m-着色判定问题总体思想:通过回溯的方法,不断为每一个节点着色,每个点的颜色由一个数字代表,初始值为1。
在对前面 step - 1 个节点都合法的着色之后,开始对第 step 个节点进行着色。
如果 n 个点均合法,且颜色数没有达到 m 种,则代表存在一种着色法使 G中任意相邻的两个顶点着不同颜色。
具体步骤:1. 对每个点 step ,有 m 种着色可能性,初始颜色值为1。
2. 检查第 step 个节点颜色的可行性,若与某个已着色的点相连且颜色相同,则不选择这种着色方案,并让颜色值加1,继续检查该点下一种颜色的可行性。
3. 如果第 step 点颜色值小于等于 m ,且未到达最后一个点,则进行对第 step + 1 点的判断。
4. 如果第 step 点颜色值大于 m ,代表该点找不到合适的分配方法。
此时算法进行回溯,首先令第 step 节点的颜色值为0,并对第 step - 1 个点的颜色值+1后重新判断。
5. 如果找到一种颜色使得第 step 个节点能够着色,说明 m 种颜色的方案是可行的。
6. 重复步骤2至5,如果最终 step 为0则代表无解。
2. m-着色优化问题基于问题1,对于一个无向图 G ,从1开始枚举染色数,上限为顶点数,第一个满足条件的颜色数即为所求解。
三、实现过程(附代码)1. m-着色判定问题#include<iostream>using namespace std;int color[100]; // 每个点的颜色int mp[100][100]; // 图的邻接矩阵int n, m, x; // n顶点,m种颜色方案,x条边bool check(int step) {// 判断与step点相邻的点,颜色是否与step点相同,若相同则返回falsefor (int i=1; i<=n; i++) {if (mp[step][i] ==1&&color[i] ==color[step]) {return false;}}return true;}bool Solve(int m) {// 求解是否可以找到一种可行的染色方案int step=1; // step指示当前节点while (step>=1) {color[step] +=1; // 假定颜色值从1开始,若为回溯,选择下一种方案while (color[step] <=m) { // 按照问题条件选择第step点颜色if (check(step)) {break;} else {color[step]++; // 搜索下一个颜色}}if (color[step] <=m&&step==n) { // 如果找完n个点,且染色方法小于等于m种 return true;} else if (color[step] <=m&&step<n) {step++; // 求解下一个顶点} else { // 如果染色数大于m个,回溯color[step] =0; // 回溯,该点找不到合适的分配方法,对上一点进行分析step--;}}// 如果step退到0,则代表无解return false;}int main() {int i, j;bool ans=false;cout<<"输入顶点数n和着色数m"<<endl;cin>>n>>m;cout<<"输入边数"<<endl;cin>>x;cout<<"具体输入每条边"<<endl;for (int p=0; p<x; p++) { // 以无向邻接矩阵存储边cin>>i>>j;mp[i][j] =1;mp[j][i] =1;}if (Solve(m)) {cout<<"有解";} else {cout<<"无解";}return0;}2. m-着色优化问题#include<iostream>using namespace std;int color[100]; // 每个点的颜色int mp[100][100]; // 图的邻接矩阵int n, m, x; // n顶点,m种颜色方案,x条边bool check(int step) {// 判断与step点相邻的点,颜色是否与step点相同,若相同则返回falsefor (int i=1; i<=n; i++) {if (mp[step][i] ==1&&color[i] ==color[step]) {return false;}}return true;}bool Solve(int m) {// 求解是否可以找到一种可行的染色方案int step=1; // step指示当前节点while (step>=1) {color[step] +=1; // 假定颜色值从1开始,若为回溯,选择下一种方案while (color[step] <=m) { // 按照问题条件选择第step点颜色if (check(step)) {break;} else {color[step]++; // 搜索下一个颜色}}if (color[step] <=m&&step==n) { // 如果找完n个点,且染色方法小于等于m种 return true;} else if (color[step] <=m&&step<n) {step++; // 求解下一个顶点} else { // 如果染色数大于m个,回溯color[step] =0; // 回溯,该点找不到合适的分配方法,对上一点进行分析step--;}}// 如果step退到0,则代表无解return false;}int main() {int i, j;bool ans=false;cout<<"输入顶点数n"<<endl;cin>>n;cout<<"输入边数"<<endl;cin>>x;cout<<"具体输入每条边"<<endl;for (int p=0; p<x; p++) { // 以无向图邻接矩阵存储边 cin>>i>>j;mp[i][j] =1;mp[j][i] =1;}for (m=1; m<=n; m++) { // 从小到大枚举着色数mif (Solve(m)) { // 如果有解,输出答案并跳出循环cout<<"最小色数m为 "<<m;break;}}return0;}四、结果及分析问题1测试用例:问题2测试用例:经检验,最少着色数的范围为2-4,意味着使 G 中任意相邻的两个顶点着不同颜色最多需要4种颜色。
四色定理-

四色定理四色定理是数学领域的一道经典难题,也是著名的图论问题之一。
该问题能够被描述为:如果一幅地图被分为若干个不重叠的区域,且相邻的区域颜色必须不同,那么至多需要使用四种颜色才能使所有区域都被正确着色。
简言之,该问题需要解决的就是如何用最少的颜色来着色地图,而不发生相邻区域颜色相同的情况。
四色定理的历史可以追溯到18世纪,当时的欧洲地图繁多、国界复杂,着色问题引起了人们的兴趣。
1786年,欧洲地图着色问题第一次在数学界被提出。
自那时以来,许多数学家花费了大量的时间和精力来尝试解决它。
在数学家们的长期探索中,有两种主要的方法被使用:一种是通过手工着色,即一张一张地着色来探索它的规律;另一种是通过建模并使用计算机进行仿真模拟来验证其正确性。
如今,这两种方法已经发展到了一定的成熟程度,成为了研究四色定理的多种手段。
在20世纪初期,四色定理开始受到广泛的关注。
当时的一些数学家就开始思考这个问题,并通过手工着色和自动推断发现了许多有趣的规律。
例如,发现了不同类型的地图样式可以用同样的着色方法来解决问题:方格状地图只需要四种颜色,而其他的复杂地图则需要更多的颜色。
这一发现为解决四色定理提供了重要线索。
然而,在后来的研究过程中,四色定理的复杂性逐渐表现出来。
当时,数学家们尝试使用多种方法来证明其正确性,但不论是哪种方式,都需要很高的数学造诣和极度复杂的计算,使得这个问题变得异常艰深。
在20世纪40年代,数学家们开始逐渐发展出一种全新的数学研究方法:计算机模拟。
由于计算机的出现,许多数学问题的解决变得越来越容易。
此时,数学家们尝试了用计算机模拟方法来验证四色定理,他们用计算机对地图进行极其复杂的分割,最终发现所有的复杂分割都可以用最多四种颜色来着色。
这就是四色定理的重要结论:世界上任何一张地图都可以用最多四种颜色来着色。
四色定理是数学领域的一项里程碑式的成就,它不仅是数学史上重要的一个难题,也对计算机科学和其他领域产生了深远的影响。
图的平面性与图的着色问题

图的平面性与图的着色问题在图论中,图的平面性与图的着色问题是两个重要的研究方向。
图的平面性指的是一种特殊的图的布局方式,使得图的边不相交。
而图的着色问题是指如何给图的顶点进行染色,使得相邻的顶点颜色不相同。
本文将分别介绍图的平面性和图的着色问题,并对其进行详细讨论。
一、图的平面性(Planarity of Graphs)图的平面性是图论中一个经典的问题,研究的是如何将一个图画在平面上,使得图的边不相交。
具体而言,如果一个图可以被画在平面上,且不同边的交点只有顶点,那么我们称该图是一个平面图。
而对于不能在平面上画出来的图,则被称为非平面图。
定理1:一个图是平面图,当且仅当它不包含任何的子图同构于以下两种图之一:K5(五个没有共同边的顶点)或K3,3(六个节点,其中任意两个节点之间都有边相连但不交叉)。
这个定理被称为Kuratowski定理,它为我们判断一个图是否是平面图提供了一个有效的方法。
根据Kuratowski定理,我们可以使用该定理的逆否命题,即如果一个图中包含K5或K3,3,则该图一定是非平面图。
除了Kuratowski定理之外,还有一种判断图的平面性的方法,称为Euler公式。
Euler公式表达了平面图的顶点数、边数和面数之间的关系:V - E + F = 2其中V表示顶点数,E表示边数,F表示面数。
根据Euler公式,对于简单连接图(无环,无孤立点),如果它的顶点数大于等于3且边数大于等于3,且满足Euler公式,则该图是一个平面图。
二、图的着色问题(Graph Coloring)图的着色问题是指如何给一个图的顶点进行染色,使得相邻的顶点颜色不相同。
这里的相邻指的是有边相连的顶点。
在图论中,颜色通常表示为正整数,颜色数则表示为给定图所需的最小颜色数。
对于任意图G,G的最小颜色数被称为G的色数。
如果图G的色数为k,则称图G是可k着色的。
求解一个图的最小色数是一个复杂的问题,称为顶点着色问题(Vertex Coloring Problem),它是一个NP 完全问题。
图论讲义第6章-图的着色问题

ikik i0
( Δ + 1) 边染色。由引理 6.1.2, G[ Ei′0 ∪ Ei′k ] 中含有 u 的那个分支 H 1 是个奇圈。
ik i0 ik
vk …
im
… v3 v2
i4 i3 i2
u
i1
vm
v1
v
3
而对 k ≤ j ≤ m − 1 ,用颜色 ij+1 给 uvj 重新染色,而用颜色 ik 给 uvm 重新染色,得到一
1
, E k ) 中每个 Ei 都是非空的
设 v0 e1v1e2
eε v0 是 G 的一条 Euler 闭迹。 令 E1 = {ei i 为奇数},E 2 = {ei i 为偶数}。
于是 c = (E1, E2) 即为所求的边 2-染色。 需要说明的是,Euler 闭迹从度≥4 的顶点出发是必需的。例如在下图中,若从 2 度顶 点 u 处出发沿 Euler 闭迹交替地对边进行 2 染色,则 u 点可能仅能获得一种色(如图,1、2 表示两种颜色) 。
′′, E 2 ′′, 个( Δ+1 )边染色 c ′′ = ( E1
′′+1 ) 。同理有 c ′′( v ) ≥ c( v ) 对所有 v ∈ V 成立。故由引理 , EΔ
′ ∪ Ei′k′ ] 中含有 u 的分支 H 2 是个奇圈。 6.1.2, G[ Ei′0
vk-1
iki0 ik+1 ik
第六章 染色理论
许多实际问题可以归结为求图的匹配或者独立集。 此外, 在许多应用中, 人们希望知道: 一个给定的图, 它的边集至少能划分成多少个边不交的匹配?或它的顶点集至少能划分成多 少个点不交的独立集?这便是图的边染色和顶点染色问题。
实验四 回溯法(图着色问题)

01 234 001 1 01 1 1 01 01 21 1 01 0 3001 01 41 1 01 0
class MGraph { public:
MGraph(int v,int s); void mColoring(int m,int *x); //一维数组x,存放1~n个顶点的颜色 ~MGraph(); private: void NextValue(int k,int m,int *x); void mColoring (int k,int m,int *x); int **a; //二维数组a,存储图的邻接矩阵 int n,e; //n表示图的顶点数,e表示边数 };
无向图G
【实验内容与要求】
图的着色问题:设G=(V,E)是一连通无向图,有3 种颜色,用这些颜色为G的各顶点着色,每个顶点着 一种颜色,且相邻顶点颜色不同。试用回溯法设计一 个算法,找出所有可能满足上述条件的着色法。
无向图G
无向图G
对应这个无向图的状态空间树应该是怎样的?
是一个完全3叉树,共6层
实验四 回溯法 — 图的着色问题
图的着色问题是由地图的着色问题引申而来的: 用m种颜色为地图着色,使得地图上的每一个 区域着一种颜色,且相邻区域颜色不同。
问题处理:如果把每一个区域收缩为一个顶点, 把相邻两个区域用一条边相连接,就可以把一
个区域图抽象为一个平面图。
地图(map)中地区的相邻关系,在图(graph )中用边表示。
//若(i, j)是图的边,且相邻结点k和j颜色相同 //发生冲突,选下一种颜色
if (j==k) return; //成功选择一种颜色返回 }while (1); //循环尝试颜色 }
运行结果:
图论课件第七章图的着色

平面图的着色问题是一个经典的图论问题,其目标是在满足相邻顶点颜色不同 的条件下,使用最少的颜色对平面图的顶点进行着色。
详细描述
平面图的着色问题可以使用欧拉公式和Kuratowski定理进行判断和求解。此外 ,也可以使用贪心算法、分治策略等算法进行求解。
树图的着色问题
总结词
树图的着色问题是一个经典的图论问 题,其目标是使用最少的颜色对树图 的顶点进行着色,使得任意两个相邻 的顶点颜色不同。
分支限界算法
总结词
分支限界算法是一种在搜索树中通过剪枝和 优先搜索来找到最优解的算法。
详细描述
在图的着色问题中,分支限界算法会构建一 个搜索树,每个节点代表一种可能的着色方 案。算法通过优先搜索那些更有可能产生最 优解的节点来加速搜索过程,同时通过剪枝 来排除那些不可能产生最优解的节点。分支 限界算法可以在较短的时间内找到最优解,
尤其适用于大规模图的着色问题。
03
图的着色问题的复 杂度
计算复杂度
确定图着色问题的计算复杂度为NP-完全,意味着该问题在多项式时间 内无法得到确定解,只能通过近似算法或启发式算法来寻找近似最优解 。
图着色问题具有指数时间复杂度,因为对于n个顶点的图,其可能的颜色 组合数量为n^k,其中k为每个顶点可用的颜色数。
02
图的着色算法
贪心算法
总结词
贪心算法是一种在每一步选择中都采取当前状态下最好或最优(即最有利)的选 择,从而希望导致结果是最好或最优的算法。
详细描述
贪心算法在图的着色问题中的应用是通过逐个对顶点进行着色,每次选择当前未 被着色的顶点中颜色数最少的颜色进行着色,直到所有顶点都被着色为止。这种 算法可以保证最小化使用的颜色数量,但并不保证得到最优解。
图着色问题的整数规划模型

图着色问题的整数规划模型图着色问题是指给定一个图,如何用有限的颜色对图中的每个顶点进行染色,同时要求相邻的顶点不能具有相同的颜色。
该问题在图论和离散优化领域中具有重要的研究价值和应用意义。
在本文中,我们将介绍一种用整数规划模型来解决图着色问题的方法。
一、问题描述给定一个无向图G=(V,E),其中V是顶点的集合,E是边的集合。
现在需要为图中的每个顶点分配一种颜色,并且要求相邻的顶点之间不能分配相同的颜色。
也就是说,如果两个顶点在图中存在一条边相连,则它们不能分配相同的颜色。
二、整数规划模型为了描述图着色问题的整数规划模型,我们首先定义一组决策变量。
设顶点v属于集合V,颜色c属于集合C,那么决策变量x_vc表示顶点v是否被分配颜色c,取1表示被分配,取0表示未被分配。
接下来,我们可以定义以下约束条件:1. 每个顶点只能被分配一种颜色:对于每个顶点v,有∑(c∈C) x_vc = 1,其中∑表示求和。
2. 相邻的顶点不能分配相同的颜色:对于任意的边(u,v)∈E,有∑(c∈C) x_uc ≠ ∑(c∈C) x_vc。
3. 决策变量的取值范围:x_vc只能取0或1。
4. 目标函数:为了最小化所需的颜色数量,我们可以定义目标函数为最大化∑(v∈V) x_vc。
三、求解方法将图着色问题转化为整数规划模型后,可以使用相应的求解方法来找到最优解。
常用的求解方法包括线性规划、整数规划和混合整数规划等。
对于线性规划,我们忽略决策变量的整数限制,将约束条件和目标函数设计成线性的形式。
然后使用线性规划求解器求解可以得到一个最优解。
但需要注意的是,线性规划得到的解可能不是整数解,需要进一步进行舍入处理。
对于整数规划,我们将决策变量的整数约束加入模型中。
这样可以确保得到的解是整数解。
但整数规划问题通常是NP难问题,求解难度较大。
对于混合整数规划,我们可以采用分支定界、割平面等方法来进行求解。
这些方法可以在规模较大的问题中得到较好的解。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
问题来源
图的着色
通常所说的着色问题是指下述两类问题: 通常所说的着色问题是指下述两类问题: 1.给定无环图G=(V,E),用m种颜色为图中 的每条边着色,要求每条边着一种颜色, 的每条边着色,要求每条边着一种颜色,并 使相邻两条边有着不同的颜色, 使相邻两条边有着不同的颜色,这个问题称 为图的边着色问题。 为图的边着色问题。 2.给定无向图G=(V,E),用m种颜色为图中 的每个顶点着色,要求每个顶点着一种颜色, 的每个顶点着色,要求每个顶点着一种颜色, 并使相邻两顶点之间有着不同的颜色, 并使相邻两顶点之间有着不同的颜色,这个 问题称为图的顶着色问题。 问题称为图的顶着色问题。
化简得
( a + bd )(b + aceg )(c + bdef )( d + aceg )(e + bcdf )( f + ceg )( g + bdf )
求极小覆盖法- 求极小覆盖法-布尔代数法
Step3:从中挑选所用极大独立集个数最小者, Step3:从中挑选所用极大独立集个数最小者, 即为X 即为X(G) 但上述子集的颜色数都不是X ),正确的应 但上述子集的颜色数都不是X(G),正确的应 该是X =3,该子集为: {b,d,f}中的 该是X(G)=3,该子集为:给{b,d,f}中的 b,d,f涂颜色 涂颜色1 {a,e,g}中a,e,g涂颜色 涂颜色2 b,d,f涂颜色1,为{a,e,g}中a,e,g涂颜色2为 {a,c,g}中的 涂颜色3 中的c {a,c,g}中的c涂颜色3。 由此可见, 由此可见,求色数其需要求极大独立集以 及一切若干极大独立集的和含所有顶点的子 对于大图, 集,对于大图,因为图计算量过大而成为实 际上难以凑效的算法,所以不是一个好算法, 际上难以凑效的算法,所以不是一个好算法, 一般我们采用贪心法等近似算法来求解 。
求极小覆盖法- 求极小覆盖法-布尔代数法
求极小覆盖的方法-布尔代数法: 求极小覆盖的方法 布尔代数法: 布尔代数法 对于每个顶点v,选择v或者选择 或者选择v的所有邻 对于每个顶点 ,选择 或者选择 的所有邻 首先把“选择顶点v”这个指令记为符号 这个指令记为符号v, 点。首先把“选择顶点 这个指令记为符号 , 然后对给定的指令x和 ,指令“ 或 和 然后对给定的指令 和y,指令“x或y”和“x与y” 与 分别记为x+y(逻辑和)和x.y(逻辑积)。 分别记为 (逻辑和) (逻辑积)。 例如 , 指令 “ 选择 a 与 b, 或者选择 b 与 c”记为 例如, 指令“ 选择a与 b , 或者选择b与 c” 记为 ab+bc。从形式上看 , 逻辑和与逻辑积类似与集 。 从形式上看, 合的∪ 合的 ∪ 和 ∩, 而且关于 ∪ 和 ∩成立的代数法则对 , 而且关于∪ 成立的代数法则对 于这两个运算也成立。 于这两个运算也成立。 布尔恒等式 aa=a a+a=a (ab + bc)(a + bd) = aba + abbd + a+ab=a bca + bcbd = ab + abd + bcd + bca + bcd 如:
穷举法-Welch Powell着色法
I.将图G中的结点按度数的递减顺序进行排列 这种排列可能不是唯一的, (这种排列可能不是唯一的,因为有些结点的度 数相同) 数相同)。 II.用第一种颜色对第一结点着色,并按排列顺 II.用第一种颜色对第一结点着色, 序对与前面着色结点不邻接的每一结点着上同样 的颜色。 的颜色。 III.用第二种颜色对尚未着色的结点重复II, III.用第二种颜色对尚未着色的结点重复II II, 用第三种颜色继续这种做法, 用第三种颜色继续这种做法,直到所有的结点全 部着上色为止。 部着上色为止。
顶点着色-基本概念
独立集:对图G=(V,E),设S是V的一个子集,若 独立集:对图 的一个子集, , 是 的一个子集 中任意两个顶点在G中均不相邻 则称S为 的一 中均不相邻, 中任意两个顶点在 中均不相邻,则称 为G的一 个独立集。 个独立集。 最大独立集:如果 不包含适合 >|S|的独立 最大独立集:如果G不包含适合 不包含适合|S'|> 的独立 的最大独立集。 集S',则称 为G的最大独立集。 ,则称S为 的最大独立集 极大覆盖:设K是G的一个独立集,并且对于V-K 极大覆盖: K是G的一个独立集 并且对于V-K 的一个独立集, 的任一顶点v, 都不是G的独立集 的任一顶点 ,K+v都不是 的独立集,则称 是 都不是 的独立集,则称K是 G的一个极大覆盖。 的一个极大覆盖。 的一个极大覆盖 极小覆盖:极大独立集的补集称为极小覆盖。 极小覆盖:极大独立集的补集称为极小覆盖。 V的子集 是G的极小覆盖当且仅当:对于每个顶 的子集K是 的极小覆盖当且仅当 的极小覆盖当且仅当: 的子集 或者v属于 的所有邻点属于K( 点v或者 属于 ,或者 的所有邻点属于 (但两 或者 属于K,或者v的所有邻点属于 者不同时成立) 者不同时成立)。
问题来源
图的着色问题是由地图的着色问题引申而来的: 图的着色问题是由地图的着色问题引申而来的:用 种颜色为地图着色, m种颜色为地图着色,使得地图上的每一个区域 着一种颜色,且相邻区域颜色不同。 着一种颜色,且相邻区域颜色不同。 问题处理:如果把每一个区域收缩为一个顶点, 问题处理:如果把每一个区域收缩为一个顶点,把 相邻两个区域用一条边相连接, 相邻两个区域用一条边相连接,就可以把一个区 域图抽象为一个平面图。 域图抽象为一个平面图。 例如, 12所示的区域图可抽象为12 12例如,图12-1(a)所示的区域图可抽象为12-1(b) 所表示的平面图。19世纪50年代,英国学者提出 所表示的平面图。19世纪50年代, 世纪50年代 了任何地图都可以4中颜色来着色的4色猜想问题。 了任何地图都可以4中颜色来着色的4色猜想问题。 过了100多年, 100多年 过了100多年,这个问题才由美国学者在计算机 上予以证明,这就是著名的四色定理。例如, 上予以证明,这就是著名的四色定理。例如,在 12区域用城市名表示,颜色用数字表示, 图12-1中,区域用城市名表示,颜色用数字表示, 则图中表示了不同区域的不同着色问题 。
顶点着色-基本概念
K可着色:G的一个k顶点着色是指k种颜色1,2,…,k对于G各顶点的 可着色: 的一个k顶点着色是指k种颜色1,2,…,k对于G 1,2, 对于 一个分配,如果任意两个相邻顶点都分配到不同的颜色, 一个分配,如果任意两个相邻顶点都分配到不同的颜色,则称着 色是正常的。换句话说,无环图G的一个正常k顶点着色是把V 色是正常的。换句话说,无环图G的一个正常k顶点着色是把V分成 可能有空的)独立集的一个分类( 2,… k个(可能有空的)独立集的一个分类(V1,V2,…,Vk)。当G有一个 正常k顶点着色时,就成G 顶点可着色的。 正常k顶点着色时,就成G是k顶点可着色的。 G的色数X(G)是指G为k可着色的k的最小值,若X(G)=k,则称G 的色数X 是指G 可着色的k的最小值, =k,则称G 色的。 是k色的。 事实上,如果我们将同色的顶点列入一个顶点子集,那么求X(G) 事实上,如果我们将同色的顶点列入一个顶点子集,那么求X 就转为求满足下列条件的最少子集数k 就转为求满足下列条件的最少子集数k: 两两子集中的顶点不同; (1)两两子集中的顶点不同; 子集中的两两顶点不相邻。 (2)子集中的两两顶点不相邻。 显然有: 为平凡图, =1; 显然有: (i)若G为平凡图,则X(G)=1; ii) 为偶图, (ii)若G为偶图,则X(G)=2 iii)对任意图G Δ+1(这里Δ (iii)对任意图G,有X(G)≤Δ+1(这里Δ表示为顶点 数最大值) 数最大值)
顶点着色- 顶点着色-求顶色数的算法设计
我们由“每个同色顶点集合中的两两顶点不相邻”可以看出, 我们由“每个同色顶点集合中的两两顶点不相邻”可以看出,同色顶 点集实际上是一个独立集,当我们用第1种颜色上色时, 点集实际上是一个独立集,当我们用第1种颜色上色时,为了尽可 能扩大颜色1的顶点个数,逼近所用颜色数最少的目的, 能扩大颜色1的顶点个数,逼近所用颜色数最少的目的,事实上就 是找出图G的一个极大独立集并给它涂上颜色1 用第2 是找出图G的一个极大独立集并给它涂上颜色1。用第2种颜色上色 同样选择另一个极大独立集涂色,...,当所有顶点涂色完毕, 时,同样选择另一个极大独立集涂色,...,当所有顶点涂色完毕, 所用的颜色数即为所选的极大独立集的个数。 所用的颜色数即为所选的极大独立集的个数。 当然,上述颜色数未必就是X ),而且其和能够含所有顶点的极大 当然,上述颜色数未必就是X(G),而且其和能够含所有顶点的极大 独立集个数未必唯一。 独立集个数未必唯一。于是我们必须从一切若干极大独立集的和 含所有顶点的子集中,挑选所用极大独立集个数最小者, 含所有顶点的子集中,挑选所用极大独立集个数最小者,其个数 即为所用的颜色数X 即为所用的颜色数X(G)。 由此可以得算法步骤: 由此可以得算法步骤: Step1: 图的所有极大独立集; Step1:求G图的所有极大独立集; Step2:求出一切若干极大独立集的和含所有顶点的子集; Step2:求出一切若干极大独立集的和含所有顶点的子集; Step3:从中挑选所用极大独立集个数最小值,即为X Step3:从中挑选所用极大独立集个数最小值,即为X(G)。
回溯法
由于用m种颜色为无向图G=(V,E)着色,其中,V的顶点个 着色,其中, 2,…, 数为n,可以用一个n元组C=(c1,c2, ,cn)来描述图的一 种可能着色,其中, 种可能着色,其中,ci∈{1, 2, …, m},(1≤i≤n)表示 , 的颜色。 赋予顶点i的颜色。 例如, 元组(1, 1)表示对具有 表示对具有5 例如,5元组(1, 2, 2, 3, 1)表示对具有5个顶点的无 向图12.3 12.3( 的一种着色,顶点1着颜色1 顶点2 向图12.3(a)的一种着色,顶点1着颜色1,顶点2着颜色 顶点3着颜色2 如此等等。 2,顶点3着颜色2,如此等等。 如果在n元组C中,所有相邻顶点都不会着相同颜色,就称 所有相邻顶点都不会着相同颜色, 元组为可行解,否则为无效解。 此n元组为可行解,否则为无效解。 回溯法求解图着色问题:首先把所有顶点的颜色初始化为 回溯法求解图着色问题: 然后依次为每个顶点着色。如果其中i个顶点已经着色, 0,然后依次为每个顶点着色。如果其中i个顶点已经着色, 并且相邻两个顶点的颜色都不一样, 并且相邻两个顶点的颜色都不一样,就称当前的着色是有 效的局部着色;否则,就称为无效的着色。 效的局部着色;否则,就称为无效的着色。如果由根节点 到当前节点路径上的着色,对应于一个有效着色, 到当前节点路径上的着色,对应于一个有效着色,并且路 径的长度小于n 那么相应的着色是有效的局部着色。 径的长度小于n,那么相应的着色是有效的局部着色。这 就从当前节点出发,继续探索它的儿子节点, 时,就从当前节点出发,继续探索它的儿子节点,并把