package demo1;
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++) {
if(a[k][j]==1&&x[j]==x[k])//相邻顶点颜色不能相同
return false;
}
return true;
}
图的m色着色问题 回溯法(算法设计与分析)Java
最新推荐文章于 2023-05-30 11:34:20 发布