回溯法——图的m着色问题

问题提出:

图的m着色问题提出:给定图G =(V,E)和m种颜色,用这些颜色为图G的各顶点着色,每个顶点着一种颜色。是否有一种着色法使G中每条边的2个顶点着不同颜色。这个问题是图的m可着色判定问题。

解空间结构:

排列树

代码:
public class Coloring {
	
//	属性
	static int n;//顶点个数
	static int m;//颜色数量
	static int[][] a;//邻接矩阵
	static long sum;//可行方案
	static int[] x;//当前解
	
	//初始化
	public static long coloring(int nn,int mm,int[][] aa) {
		n = nn;
		m = mm;
		a = aa;
		sum = 0;
		x = new int[n + 1];
		backtrace(1);
		return sum;
	}

	public static void backtrace(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)) {
					backtrace(t+1);
				}
				x[t] = 0;
			}
		}
		
	}

	private static boolean ok(int k) {
		for(int i = 1;i <= n; i++) {
			if(a[i][k] == 1 &&  x[i]==x[k]) {
				return false;
			}
		}
		return true;
	}

	public static void main(String[] args) {
		int n=5;
		int m=3;
		int[][] a={{-1,-1,-1,-1,-1,-1},{-1,0,1,1,1,0},{-1,1,0,1,1,1},{-1,1,1,0,1,0},{-1,0,1,1,0,1},{-1,0,1,0,1,0}};
		Coloring c=new Coloring();
		System.out.println("着色方案如下:");
		long sum=c.coloring(m, n, a);
		System.out.println("可行的着色方案数目为:"+sum);
	}
}

结果截图:

回溯法——图的m着色问题_第1张图片

你可能感兴趣的:(算法,回溯法)