着色问题与排队论

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
void GraphColor(int n, int c[ ][ ], int m) //所有数组下标从 1 开始 { for (i=1; i<=n; i++ ) //将数组 color[n]初始化为 0 color[i]=0; k=1; while (k>=1) { color[k]=color[k]+1; while (color[k]<=m) if Ok(k) break; else color[k]=color[k]+1; //搜索下一个颜色
12.1.1
顶点着色问题
一、基本定义 对图 G=(V,E),设 S 是 V 的一个子集,若 S 中任意两个顶点在 G 中均不相邻,则称 S 为 G 的一个独立集,如果 G 不包含适合|S'|>|S|的独立集 S',则称 S 为 G 的最大独立集。 设 K 是 G 的一个独立集,并且对于 V\K 的任一顶点 v,K+v 都不是 G 的独立集,则 称 K 是 G 的一个极大覆盖。极大独立集的补集称为极小覆盖, V 的子集 K 是 G 的极小覆 盖当且仅当:对于每个顶点 v 或者 r 属于 K,或者 v 的所有邻点属于 K(但两者不同时成 立) 。 G 的一个 k 顶点着色是指 k 种颜色 1,2,…,k 对于 G 各顶点的一个分配,如果任意两个 相邻顶点都分配到不同的颜色,则称着色是正常的。换句话说,无环图 G 的一个正常 k 顶 点着色是把 V 分成 k 个(可能有空的)独立集的一个分类 (V1,V2,„,Vk)。当 G 有一个正常 k 顶点着色时,就成 G 是 k 顶点可着色的。 G 的色数 X(G)是指 G 为 k 可着色的 k 的最小值,若 X(G)=k,则称 G 是 k 色的。 ·160·
ACM 程序设计培训教程
( a) 图 12-1 把区域图抽象为平面图的例子
(b)
Hale Waihona Puke 通常所说的着色问题是指下述两类问题: 1.给定无环图 G=(V,E),用 m 种颜色为图中的每条边着色,要求每条边着一种颜色, 并使相邻两条边有着不同的颜色,这个问题称为图的边着色问题。 2.给定无向图 G=(V,E),用 m 种颜色为图中的每个顶点着色,要求每个顶点着一种颜 色,并使相邻两顶点之间有着不同的颜色,这个问题称为图的顶着色问题。
第 12 章 着色问题与排队论 事实上,如果我们将同色的顶点列入一个顶点子集,那么求 X(G)就转为求满足下 列条件的最少子集数 k: (1)两两子集中的顶点不同; (2)子集中的两两顶点不相邻。 显然有: (i)若 G 为平凡图,则 X(G)=1; (ii)若 G 为偶图,则 X(G)=2; (iii)对任意图 G,有 X(G)≤Δ +1(这里Δ 表示为顶点数最大值) 二、求顶色数的算法设计 我们由“每个同色顶点集合中的两两顶点不相邻”可以看出,同色顶点集实际上是一 个独立集,当我们用第 1 种颜色上色时,为了尽可能扩大颜色 1 的顶点个数,逼近所用颜 色数最少的目的,事实上就是找出图 G 的一个极大独立集并给它涂上颜色 1。用第 2 种颜 色上色时,同样选择另一个极大独立集涂色, ...,当所有顶点涂色完毕,所用的颜色数即 为所选的极大独立集的个数。 当然,上述颜色数未必就是 X(G) ,而且其和能够含所有顶点的极大独立集个数未必 唯一。于是我们必须从一切若干极大独立集的和含所有顶点的子集中,挑选所用极大独立 集个数最小者,其个数即为所用的颜色数 X(G) 。 由此可以得算法步骤: Step1:求 G 图的所有极大独立集; Step2:求出一切若干极大独立集的和含所有顶点的子集; Step3:从中挑选所用极大独立集个数最小值,即为 X(G) 。 通常我们求极大独立集采用求极小覆盖的方法(布尔代数法) : 对于每个顶点 v,选择 v 或者选择 v 的所有邻点。首先把“选择顶点 v”这个指令记为 符号 v,然后对给定的指令 x 和 y,指令“x 或 y”和“x 与 y”分别记为 x+y(逻辑和)和 x.y(逻辑积) 。 例如,指令“选择 a 与 b,或者选择 b 与 c”证为 ab+bc。从形式上看,逻辑和与逻辑 积类似与集合的∪和∩,而且关于∪和∩成立的代数法则对于这两个运算也成立。 布尔恒等式 aa=a a+a=a a+ab=a 如: (ab bc)(a bd) aba abbd bca bcbd ab abd bcd bca bcd ab bcd 例 1:求图 12-2G 的顶色数 解: Step1:求极大独立集 先求图 G 的极小覆盖 (a bd )(b aceg )(c bdef )(d aceg )(e bcdf )( f ceg )( g bdf ) 化简得 aceg bc deg bdef bdef bcdf 故 G 的极小覆盖为 {a, c, e, g},{b, c, d , e, g},{b, d , e, f },{b, c, d , f }
解法三:贪心算法 例如,图 12-4(a)所示的图可以只用两种颜色着色,将顶点 1、3 和 4 着成一种颜色, 将顶点 2 和顶点 5 着成另外一种颜色。 为简单起见, 下面假定 k 个颜色的集合为{颜色 1, 颜 色 2, …, 颜色 k}。
( a) 图 12-4
(b)
贪心策略: 选择一种颜色,以任意顶点作为开始顶点,依次考察图中的未被着色的每个顶点,如 果一个顶点可以用颜色 1 着色,换言之,该顶点的邻接点都还未被着色,则用颜色 1 为该 顶点着色,当没有顶点能以这种颜色着色时,选择颜色 2 和一个未被着色的顶点作为开始 顶点,用第二种颜色为尽可能多的顶点着色,如果还有未着色的顶点,则选取颜色 3 并为 尽可能多的顶点着色,依此类推,如图 12.4(b)所示。 设数组 color[n]表示顶点的着色情况,贪心法求解图着色问题的算法如下: 图着色贪心法:1.color[1]=1; //顶点 1 着颜色 1 2.for (i=2; i<=n; i++) //其他所有顶点置未着色状态 color[i]=0; ·164·
·163·
ACM 程序设计培训教程
if (color[k]<=m && k= =n) //求解完毕,输出解 { for (i=1; i<=n; i++) cout<<color[i]; return; } else if (color[k]<=m && k<n) k=k+1; //处理下一个顶点 else { color[k]=0; k=k-1; //回溯 } } } bool Ok(int k) //判断顶点 k 的着色是否发生冲突 { for (i=1; i<k; i++) if (c[k][i]= =1 && color[i]= =color[k]) return false; return true; }
第 12 章 着色问题与排队论 个顶点着颜色 1,否则,对当前子树的兄弟子树继续搜索,也就是为当前顶点着下一个颜 色,如果所有 m 种颜色都已尝试过并且都发生冲突,则回溯到当前结点的父结点处,上一 个顶点的颜色被改变,依此类推。回溯法搜索空间如图 12-3(b) 。
(a)一个无向图 图 12-3
(b)回溯法搜索空间 回溯法求解图着色问题示例
设数组 color[n]表示顶点的着色情况,回溯法求解 m 着色问题的算法如下: 图着色回溯法: 1.将数组 color[n]初始化为 0; 2.k=1; 3.while (k>=1) 3.1 依次考察每一种颜色,若顶点 k 的着色与其他顶点的着色不发生冲突,则转 步骤 3.2;否则,搜索下一个颜色; 3.2 若顶点已全部着色,则输出数组 color[n],返回; 3.3 否则, 3.3.1 若顶点 k 是一个合法着色,则 k=k+1,转步骤 3 处理下一个顶点; 3.3.2 否则,重置顶点 k 的着色情况,k=k-1,转步骤 3。
图 12-2
·161·
ACM 程序设计培训教程
取其补集,得到 G 的所有极大独立集: {b, d , f },{a, f },{a, c, g},{a, e, g} Step2:求出一切若干极大独立集和所有顶点的子集 显然我们可以选用 4 种颜色给每个顶点涂色,或者选用 3 种颜色分别给 3 个极大独立 集涂色,例如为{b,d,f}中的 b、d、f 涂颜色 1,为{a,f}中的 a 涂颜色 2,为{a,c,g} 中的 c 和 g 涂颜色 3,为{a,e,g}中的 e 涂颜色 4。 Step3:从中挑选所用极大独立集个数最小者,即为 X(G) 但上述子集的颜色数都不是 X(G) ,正确的应该是 X(G)=3 该子集为:给{b,d,f}中的 b,d,f 涂颜色 1,为{a,e,g}中 a,e,g 涂颜色 2 为{a,c,g}中的 c 涂 颜色 3。 由此可见,求色数其需要求极大独立集以及一切若干极大独立集的和含所有顶点的子 集,对于大图,因为图计算量过大而成为实际上难以凑效的算法,所以不是一个好算法, 一般我们采用贪心法等近似算法来求解 。 解法一:穷举法 从颜色数 1 种开始,逐个举出所有可能的着色方案(所有可能的组合方案) ,检查这样 的分组是否满足要求的分组,自然是最优。 Welch Powell(韦尔奇•鲍威尔)着色法: I.将图 G 中的结点按度数的递减顺序进行排列 (这种排列可能不是唯一的,因为有些 结点的度数相同)。 II.用第一种颜色对第一结点着色,并按排列顺序对与前面着色结点不邻接的每一结 点着上同样的颜色。 III.用第二种颜色对尚未着色的结点重复 II,用第三种颜色继续这种做法,直到所有 的结点全部着上色为止。 给定图 G,用 Welch Powell 法对图 G 着色: 第一步:将图 G 中的结点按度数的递减顺序排列: A5 , A3 , A7 , A1 , A2 , A4 , A6 , A8 第二步:用第一种颜色对 A5 着第一种颜色,并对与 A5 不邻接的结点 A1 也着第一种颜色。 第三步:对结点 A3 及与 A3 不邻接的结点 A4、A8 着第二种颜色。第四步:对结点 A7 及与 A7 不邻接的结点 A2、A6 着第三种颜色。 可见,图 G 是三色的。但图 G 不可能是二色的,因为 A1, A2, A3 相互邻接,故必须着 三种颜色。所以 x(G)=3。 解法二:回溯法: 由于用 m 种颜色为无向图 G=(V,E)着色,其中,V 的顶点个数为 n,可以用一个 n 元组 C=(c1,c2,…,cn)来描述图的一种可能着色,其中, ci∈{1, 2, …, m} (1≤i≤n)表示赋予顶点 i 的颜色。 例如,5 元组(1, 2, 2, 3, 1)表示对具有 5 个顶点的无向图 12.3(a)的一种着色,顶点 1 着颜色 1,顶点 2 着颜色 2,顶点 3 着颜色 2,如此等等。 如果在 n 元组 C 中,所有相邻顶点都不会着相同颜色,就称此 n 元组为可行解,否则 为无效解。回溯法求解图着色问题,首先把所有顶点的颜色初始化为 0,然后依次为每个 顶点着色。在图着色问题的解空间树中,如果从根结点到当前结点对应一个部分解,也就 是所有的颜色指派都没有冲突,则在当前结点处选择第一棵子树继续搜索,也就是为下一 ·162·
第 12 章 着色问题与 排队论
图的着色问题是由地图的着色问题引申而来的:用 m 种颜色为地图着色,使得地图上 的每一个区域着一种颜色,且相邻区域颜色不同。如果把每一个区域收缩为一个顶点,把 相邻两个区域用一条边相连接, 就可以把一个区域图抽象为一个平面图。 例如, 图 12-1 (a) 所示的区域图可抽象为 12-1(b)所表示的平面图。19 世纪 50 年代,英国学者提出了任何 地图都可以 4 中颜色来着色的 4 色猜想问题。过了 100 多年,这个问题才由美国学者在计 算机上予以证明,这就是著名的四色定理。例如,在图 12-1 中,区域用城市名表示,颜色 用数字表示,则图中表示了不同区域的不同着色问题。
相关文档
最新文档