物业客服部的职能:算法设计与分析 5.8 图的 m 着色问题
来源:百度文库 编辑:中财网 时间:2024/04/29 08:58:04
* 5.8 图的 m 着色问题
*
* 给定无向连通图 G 和 m 种不同的颜色。用这些颜色为图 G 和各顶点着色,每
* 个顶点着一种颜色。是否有一种着色法使得图 G 中每条边的两个顶点着不同的颜
* 色。这个问题是图的 m 可着色判定问题。若一个图最少需要 m 种颜色才能使图
* 中的每条边连接的两个顶点着不同的颜色,则称这个数 m 为该图的色数。求一个
* 图的色数 m 的问题称为图的 m 可着色优化问题。
*
* 子集树,O(n*(m^n))时间复杂度
************************************************************/
import java.util.Arrays;
public class Coloring {
static int n; //图的顶点数
static int m; //可用颜色数
static boolean[][] a; //图的邻接矩阵
static int[] x; //当前解
static long sum; //当前找到的可 m 着色的方案数
/**
*
* @param matrix 地图
* @param mm 颜色数
* @return 着色方案数
*/
public static long mColoring(boolean[][] matrix, int mm) {
a = matrix;
n = a.length;
m = mm;
x = new int[n];
sum = 0;
trackback(0);
return sum;
}
private static void trackback(int t) {
if (t == n) {
sum++;
System.out.println(Arrays.toString(x));
} else {
for (int i = 0; i < m; i++) {
x[t] = i;
if (valid(t)) {
trackback(t + 1);
}
}
}
}
private static boolean valid(int t) {
//检查颜色可用性
for (int i = 0; i < n; i++) {
if (a[t][i] && x[i] == x[t]) {
return false;
}
}
return true;
}
}