public class Coloring {
static int n, // 图的顶点数
m; // 可用的颜色数
static boolean[][] a; // 图的邻接矩阵
static int[] x; // 当前解
static long sum; // 当前已找到的可m着色的方案数
public static long mColoring(int mm) {
m = mm;
sum = 0;
x = new int[n + 1];
backtrack(1);
return sum;
}
private static void backtrack(int t) {
if (t > n) {
sum ++;
for (int i = 1; i <= n; i++) {
System.out.printf(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;
}
}
}
private static boolean ok(int k) {
// 检查颜色可用性
for (int j = 1; j <= n; j++) {
if (a[k][j] && (x[j] == x[k])) {
return false;
}
}
return true;
}
public static void main(String[] args) {
// 构建图对应的矩阵,注:第一行、列全部为false无关点,
// 只是为了适应代码的起始下标
boolean[][] a = {
{false,false,false,false,false,false,false},
{false,false,true,false,false,true,true},
{false,true,false,true,true,true,false},
{false,false,true,false,true,false,false},
{false,false,true,true,false,true,false},
{false,true,true,false,false,false,true},
{false,true,false,false,false,true,false}
};
Coloring.a = a;
Coloring.n = 6;
Coloring.mColoring(3);//输入颜色数,已试过2时无解
System.out.println(Coloring.sum);//可得到的方案数
}
}
(回溯法)图的n着色问题
最新推荐文章于 2024-05-16 00:09:19 发布