贪心法求解着色问题。
给图的所有结点着色,限制是一条边的两个端点不能用同样的颜色,要求所使用的不同颜色的数目最少。
“贪心”算法的思想是首先 用第一种颜色对图中尽可能多的顶点着色(“尽可能多”表现出“贪心”);然后用第二种颜色对余下的顶点中尽可能多的顶点着色;如此等等,直到把所有的顶点都着完色。当用一种新颜色对余下的顶点着色时,我们采取下列步骤:
(1)选取某个未着色的顶点,并且用新颜色对它着色。
(2)扫描所有未着色的顶点集,对其中的每个顶点,确定它是否与已着新颜色的任何顶点相邻。若不相邻,则用新颜色对它着色。
while 有结点未着色;
{ 选择一种新颜色;
在未着色的结点中,给尽可能多的彼此结点之间没有边点着色;
}
代码:
import java.util.Scanner;
//图着色问题
/*
无向图邻接矩阵示例
0 1 1 1 0
1 0 1 1 1
1 1 0 1 0
1 1 1 0 1
0 1 0 1 0
*/
/*
0 1
1 0
*/
/*
0 1 1 0
1 0 1 1
1 1 0 1
0 1 1 0
*/
/*
0 1 1 1
1 0 1 1
1 1 0 1
1 1 1 0
*/
public class GRcolor{
int n;//顶点数
int[] color;//color[k]=m表示第k个顶点着色m
int[][] c;//邻接矩阵
public GRcolor(int n,int[][]c){
this.n=n;
this.c=c;
color=new int[n+1];
}
private boolean ok(int k,int r)//判断顶点k的着色是否发生冲突
{
for(int i=1;i<n;i++){
if(color[i]!=r) continue;
if(c[k][i]==1&&color[i]==r )
return true;
}
return false;
}
private int graphcolor()
{
for(int i=1;i<=n;i++)
color[i]=0;//初始化
int k=1,m=0,sum=0;
while(sum<n){
m++;
for(int i=1;i<=n;i++){
if(color[i]==0){
k=i;
color[k]=m;
sum++;
break;
}
}
for(int i=k+1;i<=n;i++){
if(color[i]!=0) continue;
if (ok(i,m)) continue;
else {
color[i]=m;
sum++;
}
}
}
System.out.printf("着色方案:\n");
//求解完毕,输出着色方案
for(int i=1;i<=n;i++){
System.out.printf("%d ",color[i]);
}
System.out.println();
return m;
}
public static void main(String args[]){
Scanner in=new Scanner(System.in);
System.out.printf("输入顶点数n\n");
int n=in.nextInt();
int[][] c=new int[n+1][n+1];//存储n个顶点的无向图的数组
System.out.printf("输入无向图的邻接矩阵:\n");
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
c[i][j]=in.nextInt();;
GRcolor gc=new GRcolor(n,c);
int m=gc.graphcolor();
System.out.println("最小着色数="+m);
}
}
运行:
输入顶点数n
5
输入无向图的邻接矩阵:
0 1 1 1 0
1 0 1 1 1
1 1 0 1 0
1 1 1 0 1
0 1 0 1 0
着色方案:
1 2 3 4 1
最小着色数=4
C:\java>java GRcolor
输入顶点数n
2
输入无向图的邻接矩阵:
0 1
1 0
着色方案:
1 2
最小着色数=2
C:\java>java GRcolor
输入顶点数n
4
输入无向图的邻接矩阵:
0 1 1 0
1 0 1 1
1 1 0 1
0 1 1 0
着色方案:
1 2 3 1
最小着色数=3
下载源码:
分享到:
相关推荐
14. **回溯法**:在解决问题时尝试所有可能的路径,直到找到解决方案或确定无解,如八皇后问题、N皇后问题、图着色问题。 这个JavaAlgorithmCode资源包对于初学者和经验丰富的开发者来说都是宝贵的。通过阅读和实践...
在IT领域,算法是解决问题的核心工具,而递归与分治策略、动态规划、贪心算法、回溯法、分支限界法以及随机化算法都是其中的重要组成部分。这些算法不仅适用于计算机科学,也在数据结构、优化问题和复杂计算中扮演着...
9. 回溯法和分支限界法:用于求解多解问题,如八皇后问题、迷宫求解、图的着色问题等。 10. 随机化算法:如鸽巢原理、随机化快速选择、Monte Carlo方法等,通过引入随机性提高算法效率或解决难以确定的问题。 了解...
10. **递归与分治**:递归是解决问题的一种自我调用方法,分治策略将大问题分解为小问题求解。例如,快速排序和归并排序都是分治思想的应用。 11. **动态规划**:用于解决最优化问题,通过构建子问题并存储解,避免...
这份名为"算法设计ppt Java描述"的资料详细介绍了多种经典的算法设计策略,它们在实际编程和问题解决中扮演着至关重要的角色。以下是这些算法的详细说明: 1. **算法引论**:这是学习算法的起点,通常会涵盖算法的...
解决图着色问题通常采用回溯法、贪心算法或者图着色算法。对于较小规模的图,可以尝试穷举所有可能的着色方案,但在大规模图中,这种方法效率低下。Java中,我们可以使用邻接矩阵或邻接表来存储图的数据结构。 1. ...
6. **回溯法**:常用于解决约束满足问题,如八皇后问题、N皇后问题、图的着色问题等,通过试探性地进行选择并适时回溯,寻找所有可能的解。 7. **分治策略**:如大整数乘法、快速傅里叶变换(FFT)、归并排序等,将...
5. **回溯法**:用于解决组合优化问题,如八皇后问题、N-皇后问题、图的着色问题等。 6. **贪心算法**:在每一步选择局部最优解,期望最终得到全局最优解,如霍夫曼编码、Prim最小生成树算法、Kruskal最小生成树...
这是一个经典的组合优化问题,有多种求解方法,如贪心算法、近似算法、以及通过线性规划或分支限界法的精确求解。在实际中,顶点覆盖问题常用于网络设计、任务调度等问题。 3. **独立集问题**: 独立集问题与顶点...
7. **回溯法**:用于求解多解或无解问题,如八皇后问题、N皇后问题、图的着色问题等。 8. **分治策略**:将大问题分解为小问题,如归并排序、快速排序、大整数乘法等。 9. **递归与迭代**:是解决问题的两种基本...
5. 回溯法:用于解决组合优化问题,如八皇后问题、图着色问题等。 6. 分治法:将大问题分解为小问题解决,如快速排序、归并排序、大整数乘法等。 三、高级数据结构 1. 哈希表:通过哈希函数快速查找和插入元素,...
6. 回溯法:尝试所有可能的解决方案,遇到错误就回溯,如八皇后问题、N皇后问题、图着色问题。 7. 近似算法:在无法找到精确解的情况下,寻找接近最优解的方法,如旅行商问题、最小割问题。 8. 图论算法:如最短路径...
7. 回溯法:用于解决组合优化问题,如八皇后问题、N皇后问题、图的着色问题等。 四、实战应用 掌握这些算法和数据结构,不仅能在面试中表现出扎实的基础,更能提高实际项目开发的效率。例如,在数据库索引设计中,...
5. 回溯法:在解决问题时尝试所有可能的解决方案,如八皇后问题和图的着色问题。 6. 分支限界法:结合回溯法和剪枝策略,提高求解效率。 《数据结构与算法分析(Java版英文).pdf》这本书不仅提供了理论知识,还包括...
- **回溯法**:用于解决约束满足问题,如八皇后问题、图的着色问题。 - **图算法**:Dijkstra算法(单源最短路径)、Floyd-Warshall算法(所有顶点间的最短路径)、Prim算法和Kruskal算法(最小生成树)。 3. **...
7. **回溯法**:用于求解约束满足问题,如八皇后问题、N皇后问题、图着色问题等。 8. **分治法**:将大问题分解为小问题来解决,如归并排序、快速排序等。 通过阅读和理解这些代码,开发者不仅可以学习到数据结构和...
- **回溯法**:用于解决约束满足问题,如八皇后问题、N皇后问题、图着色问题等。 - **贪心算法**:每次做出局部最优决策,期望全局最优,如霍夫曼编码、Prim算法等。 3. **复杂度分析**: - **时间复杂度**:...
6. **回溯法**:用于求解多解或无解问题,如八皇后问题、图着色问题。 7. **图算法**:如深度优先搜索(DFS)、广度优先搜索(BFS)、Dijkstra最短路径算法、Floyd-Warshall所有对最短路径算法。 通过阅读和理解...
7. **回溯法**:用于解决问题的深度搜索,如八皇后问题、N皇后问题、图着色问题等。 8. **分治法**:将大问题拆分成小问题,独立求解后再合并,如快速排序、归并排序、大整数乘法等。 9. **计算几何**:直线、圆、...