图的m着色问题
图的m着色问题是由地图的4着色问题引申而来的。
四色猜想于1852年被提出:“任何地图能够只用4种颜色使得相邻的国家着上不同颜色。” 四色猜想被提出之后的一百五十多年时间里,许多科学家用了很长时间,花费很多精力都无法给予证明。直到1976年数学家阿佩尔和海肯借助计算机才证明了这个问题。四色猜想也终于成为四色定理
问题描述
著名的四色猜想是图的m可着色判定问题的一个特殊情况。图的m着色问题提出:给定图G =(V,E)和m种颜色,用这些颜色为图G的各顶点着色,每个顶点着一种颜色。是否有一种着色法使G中每条边的2个顶点着不同颜色。这个问题是图的m可着色判定问题。
若一个图最少需要m种颜色才能使图中每条边连接的2个顶点着不同颜色,则称这个数m为该图的色数。求一个图的色数m的问题称为图的m可着色优化问题。
简而言之,在图的m着色问题中,我们需要输入的数据是
- 图的邻接矩阵
- 颜色总数
输出的数据是:
- 是否能让图中相邻顶点不同颜色的方案,如果有,请输出方案及方案个数
定义解空间
由题目描述易知,图中一个顶点可以有m种选择,所以解空间是每个顶点的染色结果
确定解空间的结构
易知是子集树
剪枝函数
相邻顶点不能有相同颜色,因此可根据此来编写函数
代码实现
package mColoringProblem;
public class Coloring {
static int m;//颜色的数量
static int[] x;//可行解
static int n;//图的顶点个数
static int[][] a;//图的邻接矩阵
static long sum;//可行解个数
public static long color(int mm,int[][] aa,int nn) {
m=mm;
n=nn;
a=aa;
sum=0;
x=new int[n+1];
for(int i=0;i<=n;i++)
x[i]=0;
backtrack(1);
System.out.println("着色方案共有:");
return sum;
}
public static void backtrack(int t) {
if(t>n) {
sum++;
for(int i=1;i<=n;i++)
System.out.print(x[i]+" ");
System.out.println();
}else {
for(int i=1;i<=m;i++) {
x[t]=i;
if(ok(t))//剪枝函数
backtrack(t+1);
x[t]=0;
}
}
}
public static boolean ok(int k) {
for(int j=1;j<k;j++) {//教材此处是j<=n,但是我认为此时涂色只涂到第k个顶点,所以只需要对比前k个就行了
if(a[k][j]==1&&x[j]==x[k])//相邻顶点颜色不能相同
return false;
}
return true;
}
public static void main(String[] args) {
int mm=4;
int nn=6;
int[][] aa= {{-1,-1,-1,-1,-1,-1,-1},
{-1,0,1,0,0,1,1},
{-1,1,0,1,1,1,0},
{-1,0,1,0,1,0,0},
{-1,0,1,1,0,1,0},
{-1,1,1,0,1,0,1},
{-1,1,0,0,0,1,0}};
System.out.println("着色方案如下:");
System.out.println(color(mm, aa, nn));
}
}
实现结果
着色方案如下:
1 2 1 3 4 2
1 2 1 3 4 3
1 2 1 4 3 2
1 2 1 4 3 4
1 2 3 1 3 2
1 2 3 1 3 4
1 2 3 1 4 2
1 2 3 1 4 3
1 2 3 4 3 2
1 2 3 4 3 4
1 2 4 1 3 2
1 2 4 1 3 4
1 2 4 1 4 2
1 2 4 1 4 3
1 2 4 3 4 2
1 2 4 3 4 3
1 3 1 2 4 2
1 3 1 2 4 3
1 3 1 4 2 3
1 3 1 4 2 4
1 3 2 1 2 3
1 3 2 1 2 4
1 3 2 1 4 2
1 3 2 1 4 3
1 3 2 4 2 3
1 3 2 4 2 4
1 3 4 1 2 3
1 3 4 1 2 4
1 3 4 1 4 2
1 3 4 1 4 3
1 3 4 2 4 2
1 3 4 2 4 3
1 4 1 2 3 2
1 4 1 2 3 4
1 4 1 3 2 3
1 4 1 3 2 4
1 4 2 1 2 3
1 4 2 1 2 4
1 4 2 1 3 2
1 4 2 1 3 4
1 4 2 3 2 3
1 4 2 3 2 4
1 4 3 1 2 3
1 4 3 1 2 4
1 4 3 1 3 2
1 4 3 1 3 4
1 4 3 2 3 2
1 4 3 2 3 4
2 1 2 3 4 1
2 1 2 3 4 3
2 1 2 4 3 1
2 1 2 4 3 4
2 1 3 2 3 1
2 1 3 2 3 4
2 1 3 2 4 1
2 1 3 2 4 3
2 1 3 4 3 1
2 1 3 4 3 4
2 1 4 2 3 1
2 1 4 2 3 4
2 1 4 2 4 1
2 1 4 2 4 3
2 1 4 3 4 1
2 1 4 3 4 3
2 3 1 2 1 3
2 3 1 2 1 4
2 3 1 2 4 1
2 3 1 2 4 3
2 3 1 4 1 3
2 3 1 4 1 4
2 3 2 1 4 1
2 3 2 1 4 3
2 3 2 4 1 3
2 3 2 4 1 4
2 3 4 1 4 1
2 3 4 1 4 3
2 3 4 2 1 3
2 3 4 2 1 4
2 3 4 2 4 1
2 3 4 2 4 3
2 4 1 2 1 3
2 4 1 2 1 4
2 4 1 2 3 1
2 4 1 2 3 4
2 4 1 3 1 3
2 4 1 3 1 4
2 4 2 1 3 1
2 4 2 1 3 4
2 4 2 3 1 3
2 4 2 3 1 4
2 4 3 1 3 1
2 4 3 1 3 4
2 4 3 2 1 3
2 4 3 2 1 4
2 4 3 2 3 1
2 4 3 2 3 4
3 1 2 3 2 1
3 1 2 3 2 4
3 1 2 3 4 1
3 1 2 3 4 2
3 1 2 4 2 1
3 1 2 4 2 4
3 1 3 2 4 1
3 1 3 2 4 2
3 1 3 4 2 1
3 1 3 4 2 4
3 1 4 2 4 1
3 1 4 2 4 2
3 1 4 3 2 1
3 1 4 3 2 4
3 1 4 3 4 1
3 1 4 3 4 2
3 2 1 3 1 2
3 2 1 3 1 4
3 2 1 3 4 1
3 2 1 3 4 2
3 2 1 4 1 2
3 2 1 4 1 4
3 2 3 1 4 1
3 2 3 1 4 2
3 2 3 4 1 2
3 2 3 4 1 4
3 2 4 1 4 1
3 2 4 1 4 2
3 2 4 3 1 2
3 2 4 3 1 4
3 2 4 3 4 1
3 2 4 3 4 2
3 4 1 2 1 2
3 4 1 2 1 4
3 4 1 3 1 2
3 4 1 3 1 4
3 4 1 3 2 1
3 4 1 3 2 4
3 4 2 1 2 1
3 4 2 1 2 4
3 4 2 3 1 2
3 4 2 3 1 4
3 4 2 3 2 1
3 4 2 3 2 4
3 4 3 1 2 1
3 4 3 1 2 4
3 4 3 2 1 2
3 4 3 2 1 4
4 1 2 3 2 1
4 1 2 3 2 3
4 1 2 4 2 1
4 1 2 4 2 3
4 1 2 4 3 1
4 1 2 4 3 2
4 1 3 2 3 1
4 1 3 2 3 2
4 1 3 4 2 1
4 1 3 4 2 3
4 1 3 4 3 1
4 1 3 4 3 2
4 1 4 2 3 1
4 1 4 2 3 2
4 1 4 3 2 1
4 1 4 3 2 3
4 2 1 3 1 2
4 2 1 3 1 3
4 2 1 4 1 2
4 2 1 4 1 3
4 2 1 4 3 1
4 2 1 4 3 2
4 2 3 1 3 1
4 2 3 1 3 2
4 2 3 4 1 2
4 2 3 4 1 3
4 2 3 4 3 1
4 2 3 4 3 2
4 2 4 1 3 1
4 2 4 1 3 2
4 2 4 3 1 2
4 2 4 3 1 3
4 3 1 2 1 2
4 3 1 2 1 3
4 3 1 4 1 2
4 3 1 4 1 3
4 3 1 4 2 1
4 3 1 4 2 3
4 3 2 1 2 1
4 3 2 1 2 3
4 3 2 4 1 2
4 3 2 4 1 3
4 3 2 4 2 1
4 3 2 4 2 3
4 3 4 1 2 1
4 3 4 1 2 3
4 3 4 2 1 2
4 3 4 2 1 3
着色方案共有:
192