7.2.2 图着色问题
图的着色问题--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种颜色。
图的平面性与图的着色问题

图的平面性与图的着色问题在图论中,图的平面性与图的着色问题是两个重要的研究方向。
图的平面性指的是一种特殊的图的布局方式,使得图的边不相交。
而图的着色问题是指如何给图的顶点进行染色,使得相邻的顶点颜色不相同。
本文将分别介绍图的平面性和图的着色问题,并对其进行详细讨论。
一、图的平面性(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 完全问题。
离散数学图着色问题算法描述

离散数学图着色问题算法描述离散数学图着色问题,简单来说是指给定一个无向图,如何为每个节点上色,使得相邻节点的颜色不相同。
这个问题可以用图着色算法来解决,下面将对图着色问题的算法描述进行详细介绍。
1. 算法背景介绍在离散数学中,图着色问题是一种经典的组合优化问题,它有广泛的应用领域,如地图着色、时间表排课等。
该问题的关键在于找到一种最少的颜色分配方案,使得相邻节点的颜色不相同。
2. 算法步骤描述(1)初始化:给定一个无向图G,节点数为n,边数为m。
初始时,给每个节点分配一个未被使用的颜色。
(2)排序节点:按照节点的度数降序进行排序,从度数最大的节点开始着色。
(3)节点着色:依次对每个节点进行着色。
对于当前节点v,遍历它的所有相邻节点w,如果w已经被染色,则从可用的颜色集合中去除w的颜色。
最后,将v染色为可用的最小颜色。
(4)重复步骤3,直到所有节点都被染色。
3. 算法实例演示假设有以下无向图G:```A/ \B C/ \ / \D -E - F```首先,对节点进行排序,按照度数降序排序为:E(度数为4),A (度数为3),D(度数为2),B和C(度数为1),F(度数为0)。
接下来,按照排序后的顺序对每个节点进行着色。
首先着色E,将其染色为第一个可用的颜色。
然后是A,由于E已经被染色为第一个颜色,A只能选择剩下的颜色。
接着是D,由于D与已经着色的节点E邻接,所以D需要选择未被使用的颜色。
然后是B和C,它们的邻居节点E和A已经被着色,所以它们只能选择未被使用的颜色。
最后是F,由于F没有邻居节点,可以选择任意颜色。
经过上述步骤,图G的每个节点都被着色,且相邻节点的颜色不相同。
4. 算法分析该算法在最坏情况下需要对节点进行O(n^2)次比较,其中n为节点数。
因此,算法的时间复杂度为O(n^2)。
同时,该算法具有较好的可行性和实用性,对于大部分图着色问题能够给出近似最优的解。
综上所述,离散数学图着色问题的算法描述如上所述。
离散数学中的图论着色算法-教案

离散数学中的图论着色算法-教案一、引言1.1图论的发展历程1.1.118世纪欧拉解决哥尼斯堡七桥问题,奠定图论基础。
1.1.219世纪图论在数学和物理学领域得到发展。
1.1.320世纪图论在计算机科学中扮演重要角色。
1.1.4当前图论研究涉及网络科学、社会网络等多个领域。
1.2图论的基本概念1.2.1图由节点和边组成,用于表示物件与物件之间的关系。
1.2.2节点代表研究对象,边代表节点间的联系。
1.2.3图分为有向图和无向图,反映关系的方向性。
1.2.4图的度、路径、环等是图论中的基本术语。
1.3图论在现实中的应用1.3.1社交网络分析,如Facebook的社交图谱。
1.3.2电信网络设计,如电话网络的布局。
1.3.3交通运输规划,如航班路线的优化。
1.3.4计算机网络设计,如互联网的结构优化。
二、知识点讲解2.1图的着色问题2.1.1图的着色是将图中的节点用颜色进行标记,满足相邻节点颜色不同。
2.1.2着色问题分为正常着色和特定着色,如双色着色、列表着色等。
2.1.3着色问题在图论中具有重要地位,与图的性质紧密相关。
2.1.4着色问题广泛应用于地图着色、排课表、寄存器分配等领域。
2.2图的着色算法2.2.1Welsh-Powell算法,基于节点度进行着色。
2.2.2DSATUR算法,优先着色度数大且邻接节点着色多的节点。
2.2.3RLF算法,考虑节点邻接矩阵的行、列和节点度。
2.2.4图的着色算法不断发展,如启发式算法、遗传算法等。
2.3图的着色算法的应用2.3.1地图着色,确保相邻区域颜色不同。
2.3.2课程表安排,避免时间冲突。
2.3.3计算机寄存器分配,优化资源利用。
2.3.4光纤通信网络设计,减少信号干扰。
三、教学内容3.1图的着色问题的引入3.1.1通过地图着色实例引入图的着色问题。
3.1.2讲解正常着色和特定着色问题的区别。
3.1.3分析着色问题在现实中的应用场景。
3.1.4引导学生思考着色问题的数学模型。
图论课件第七章图的着色

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

图着⾊问题⼀、图着⾊问题(1)图的m可着⾊判定问题给定⽆向连通图G和m种不同的颜⾊。
⽤这些颜⾊为图G的各顶点着⾊,每个顶点着⼀种颜⾊。
是否有⼀种着⾊法使G中每条边的2个顶点着不同颜⾊。
(2)图的m可着⾊优化问题若⼀个图最少需要m种颜⾊才能使图中每条边连接的2个顶点着不同颜⾊,则称这个数m为该图的⾊数。
⼆、m可着⾊判定问题的解法【算法】(1)通过回溯的⽅法,不断的为每⼀个节点着⾊,在前⾯cur-1个节点都合法的着⾊之后,开始对第cur-1个节点进⾏着⾊,(2)这时候枚举可⽤的m个颜⾊,通过和第cur-1个节点相邻的节点的颜⾊,来判断这个颜⾊是否合法(3)如果找到那么⼀种颜⾊使得第cur-1个节点能够着⾊,那么说明m种颜⾊的⽅案在当前是可⾏的。
(4)cur每次迭代加1,如果cur增加到N并通过了检测,说明m种颜⾊是可满⾜的。
(5)注意,这⾥只是要求判断m种颜⾊是否可满⾜,所以找到任何⼀种⽅案就可以了。
【代码实现】#include<iostream>#include<cstring>using namespace std;const int maxn = 105;int G[maxn][maxn];int color[maxn];bool ans;int n,m,k;void init(){ans = 0;memset(G, 0 , sizeof G);memset(color, 0 , sizeof color);}void dfs(int cur){if(cur > n) {ans = 1;return;}for(int i=1; i<=m; i++){ //对cur结点尝试使⽤每⼀种颜⾊进⾏涂⾊bool flag = 1;//cur之前的结点必被涂⾊for(int j=1; j<cur; j++){if(G[j][cur] == 1 && color[j] == i){flag = 0;//只要有⼀个冲突都不⾏break;}}//如果可以涂上i颜⾊,则考虑下⼀个结点的情况if(flag){color[cur] = i;dfs(cur + 1);}//如果到这⼀步第cur个结点⽆法着⾊,则返回探寻其他⽅案else color[cur] = 0;//回溯 ;}}int main(){while(cin>>n>>k>>m){init();for(int i=1; i<=k; i++){int x,y;cin>>x>>y;G[x][y] = G[y][x] = 1;}dfs(1);cout<<ans<<endl;}return0;}三、m可着⾊拓展【问题】在上述基础上,求出m种颜⾊能够给图G涂⾊的总总⽅案数量【算法】由于这个时候要求总⽅案数量,所以在找到⼀种可⾏⽅案后,总是进⾏回溯再搜索其他的解决⽅案,与上⾯不同,上⾯是只需要找出⼀种⽅案即可,所以如果找到了就不需要再回溯了,所以在这⾥只需要把回溯语句的位置写到dfs语句的后⾯即可。
图的着色与染色问题

图的着色与染色问题图的着色与染色问题是图论中的一个经典问题,旨在寻找一种给图中的每个顶点染上不同颜色的方法,使得相邻的顶点具有不同颜色。
本文将介绍图的着色和染色问题的基本概念,讨论几种常见的着色算法,并探讨该问题在实际应用中的一些应用场景。
一、基本概念在介绍图的着色与染色问题之前,首先需要了解一些基本概念。
图是由一组顶点和一组边组成的数据结构,表示了顶点之间的关系。
图可以分为有向图和无向图,其中无向图的边没有方向性,有向图的边具有方向性。
对于图中的每个顶点,可以对其进行染色,也就是给顶点赋予一个颜色值。
染色是为了满足一个重要的条件:相邻的顶点不能具有相同的颜色。
相邻顶点是指在图中由一条边连接的两个顶点。
二、着色算法在解决图的着色问题时,常用的算法有贪心算法、回溯算法和深度优先搜索算法。
下面将分别介绍这三种算法的基本思想和应用场景。
1. 贪心算法贪心算法是一种简单而高效的着色算法。
该算法会选择一个顶点,为其染上一个颜色,然后遍历与该顶点相邻的顶点,为其染色。
不断重复该过程,直到所有顶点都被染色。
贪心算法的应用场景包括地图着色问题和课程表问题。
在地图着色问题中,顶点表示不同的地区,边表示不同地区之间的邻接关系。
要求相邻的地区颜色不同,使用贪心算法可以高效地解决这个问题。
在课程表问题中,顶点表示不同的课程,边表示课程之间的先修关系。
贪心算法可以帮助安排合理的课程表。
2. 回溯算法回溯算法是一种递归的算法,它通过尝试所有可能的颜色组合,直到找到满足条件的染色方案为止。
如果在尝试的过程中发现无法满足条件,则会回溯到上一个状态,重新选择颜色。
回溯算法常用于解决复杂的着色问题,例如地图染色问题和调度问题。
在地图染色问题中,回溯算法可以找到一种合理的地图着色方案。
在调度问题中,回溯算法可以帮助制定一种合理的调度方案,例如安排会议或任务的时间表。
3. 深度优先搜索算法深度优先搜索算法是一种遍历算法,通过从起始顶点开始,沿着一条路径一直搜索到底,然后回溯到上一个顶点,继续搜索其他路径,直到所有顶点都被访问。
数学中的图的着色问题与四色定理

数学中的图的着色问题与四色定理数学中的图论是一门研究图及其性质的学科,其中一个重要的问题就是图的着色问题。
图的着色问题是指如何用有限种颜色给图的顶点或边进行染色,使得相邻的顶点或边不具有相同的颜色。
这个问题在实际应用中有着广泛的应用,比如地图着色、时间表的安排等。
在图的着色问题中,最著名的就是四色定理。
四色定理是指任何平面图都可以用四种颜色进行着色,使得相邻的区域不具有相同的颜色。
这个定理在1852年被英国数学家弗朗西斯·格思·韦尔斯顿和威廉·哈姆顿·伯奇证明,被认为是图论中的一个里程碑。
证明四色定理的过程非常复杂,需要运用大量的数学知识和技巧。
其中一个重要的思想就是通过对图进行适当的分割,将大问题转化为小问题,然后逐步解决。
这种分割的方法被称为“规约法”,即将一个复杂的问题规约为一系列简单的子问题。
通过这种方法,韦尔斯顿和伯奇最终证明了四色定理的正确性。
四色定理的证明引起了广泛的关注和讨论。
人们对于这个问题的兴趣不仅在于它的应用价值,更在于它背后的数学原理和思维方式。
四色定理的证明过程中,涉及到了众多的数学概念和定理,如图的平面性、图的连通性、图的染色等。
这些概念和定理的研究不仅推动了图论的发展,也对其他领域的数学研究产生了重要影响。
除了四色定理,图的着色问题还有其他一些重要的结果。
比如,五色定理指出任何平面图都可以用五种颜色进行着色,六色定理指出任何平面图都可以用六种颜色进行着色。
这些定理的证明过程和四色定理类似,都需要运用复杂的数学技巧和方法。
图的着色问题不仅在理论上有着重要的意义,也在实际应用中发挥着重要的作用。
比如,在地图着色中,我们可以用不同的颜色表示不同的国家或地区,以便更好地区分它们。
在时间表的安排中,我们可以用不同的颜色表示不同的活动或任务,以便更好地组织和管理。
这些应用都离不开图的着色问题的研究和应用。
总之,图的着色问题是数学中一个重要且有趣的问题。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
34 A 46 19
B
12 26
B
12 E A
B
12 E
E
38
A
F
25
C 17 (a) B
F
25 D
F D (b) 17 17 12 E F 25 17 A 19 F B 12 26 E
C
C
D (c)
12 E A 19
B
A
19
F 17
25
C
C
(d) (f)
D
C
17
D
D
(e)
Kruskal方法构造最小生成树的过程
7.2 图问题中的合治法
7.2.2 图着色问题
7.2.2 图着色问题
给定无向连通图G=(V, E),求图G的最小色数k, 使得用k种颜色对G中的顶点着色,可使任意两个相 邻顶点着色不同。
例如,图7.3(a)所示的图可以只用两种颜色着色,将 顶点1、3和4着成一种颜色,将顶点2和顶点5着成另 外一种颜色。为简单起见,下面假定k个颜色的集合 为{颜色1, 颜色2, …, 颜色k}。 3 1 2 4 5
设连通网中有n个顶点,则第一个进行初始化的循环语句需要执行n-1次,第二个 循环共执行n-1次,内嵌两个循环,其一是在长度为n的数组中求最小值,需要执 行n-1次,其二是调整辅助数组,需要执行n-1次,所以,Prim算法的时间复杂度 为 O( n2 ) 。
( 2 )最短边策略:设 G = ( V , E ) 是一个无向连通 网,令T=(U,TE)是G的最小生成树。最短边策略 从 TE ={} 开始,每一次合治选择都是在边集 E 中选 取最短边(u, v),如果边(u, v)加入集合TE中不产生 回路,则将边(u, v)加入边集TE中,并将它在集合 E中删去。 Kruskal算法就应用了这个合治策略,它使生 成树以一种随意的方式生长,先让森林中的树木随 意生长,每生长一次就将两棵树合并,到最后合并 成一棵树。
3 1 2 3
5
1
4
2
5 4
设数组color[n]表示顶点的着色情况,合治法求解图着色问题的算法如下:
算法7.3——图着色问题
1.color[1]=1; //顶点1着颜色1 2.for (i=2; i<=n; i++) //其他所有顶点置未着色状态 color[i]=0; 3.k=0; 4.循环直到所有顶点均着色 4.1 k++; //取下一个颜色 4.2 for (i=2; i<=n; i++) //用颜色k为尽量多的顶点着色 4.2.1 若顶点i已着色,则转步骤4.2,考虑下一个顶点; 4.2.2 若图中与顶点i邻接的顶点着色与顶点i着颜色k不冲突 ,
合治策略:选择一种颜色,以任意顶点作为开始顶点,依次考察图中的未被着色的 每个顶点,如果一个顶点可以用颜色1着色,换言之,该顶点的邻接点都还未被着 色,则用颜色1为该顶点着色,当没有顶点能以这种颜色着色时,选择颜色2和一个 未被着色的顶点作为开始顶点,用第二种颜色为尽可能多的顶点着色,如果还有未 着色的顶点,则选取颜色3并为尽可能多的顶点着色,
图7.4 具有8个顶点的双向图
设图G中顶点的编号为0~n-1,Prim算法如下:
算法7.4——Prim算法 1. 初始化两个辅助数组lowcost和adjvex; 2. U={u0}; 输出顶点u0; //将顶点u0加入生成树中 3. 重复执行下列操作n-1次 3.1 在lowcost中选取最短边,取adjvex中对应的顶点序号 k; 3.2 输出顶点k和对应的权值; 3.3 U=U+{k}; 3.4 调整数组lowcost和adjvex;
合治法的一般过程
Greedy(C) //C是问题的输入集合即候选集合 { S={ }; //初始解集合为空集 while (not solution(S)) //集合S没有构成问题的一个解 { x=select(C); //在候选集合C中做合治选择 if feasible(S, x) //判断集合S中加入x后的解是否可行 S=S+{x}; C=C-{x}; } return S; }
例:用合治法求解付款问题。 假设有面值为5元、2元、1元、5角、2角、1角的货币,需要找给顾客4元6角 现金,为使付出的货币的数量最少,首先选出1张面值不超过4元6角的最大面
值的货币,即2元,再选出1张面值不超过2元6角的最大面值的货币,即2元,
再选出1张面值不超过6角的最大面值的货币,即5角,再选出1张面值不超过1 角的最大面值的货币,即1角,总共付出4张货币。
则color[i]=k; 5.输出k;
考虑一个具有2n个顶点的无向图,顶点的编号从1 到2n,当i是奇数时,顶点i与除了顶点i+1之外的其 他所有编号为偶数的顶点邻接,当i是偶数时,顶点i 与除了顶点i-1之外的其他所有编号为奇数的顶点邻 接,这样的图称为双向图(Bipartite)。
1 3 5 7
用合治法求解问题应该考虑如下几个方面:
( 1 )候选集合 C :为了构造问题的解决方案,有 一个候选集合 C作为问题的可能解,即问题的最终 解均取自于候选集合 C。例如,在付款问题中,各 种面值的货币构成候选集合。
(2)解集合S:随着合治选择的进行,解集合S不 断扩展,直到构成一个满足问题的完整解。例如, 在付款问题中,已付出的货币构成解集合。
合治法在解决问题的策略上目光短浅,只根据当 前已有的信息就做出选择,而且一旦做出了选择, 不管将来有什么结果,这个选择都不会改变。换言 之,合治法并不是从整体最优考虑,它所做出的选 择只是在某种意义上的局部最优。 这种局部最优选择并不总能获得整体最优解( Optimal Solution),但通常能获得近似最优解( Near-Optimal Solution)。