图的着色问题

合集下载

chap12 图的着色

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++实现(含详细注释)

图的着色问题--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章-图的着色问题

图论讲义第6章-图的着色问题
… H1 vk-1
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. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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,那么相应的着色是有效的局部着色。这 就从当前节点出发,继续探索它的儿子节点, 时,就从当前节点出发,继续探索它的儿子节点,并把
相关文档
最新文档