JAVA图的m着色问题

题目:
题目描述

给定无向连通图G和m种不同的颜色。用这些颜色为图G的各顶点着色,每个顶点着一种颜色。是否有一种着色法使G中每条边的2个顶点着不同颜色,请输出着色方案。

输入

输入第一行包含n,m,k分别代表n个结点,m条边,k种颜色,接下来m行每行有2个数u,v表示u和v之间有一条无向边,可能出现自环边,所以请忽略自环边。

输出

输出所有不同的着色方案,且按照字典序从小到大输出方案。

样例输入 Copy

3 3 3
1 2
1 3
2 3

样例输出 Copy

1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

package book;

import java.util.Scanner;
/*
 * 总结:图的m色问题
 * 给第t个点着色,要判断与该点有边的点着色的颜色是否一样
 * 对于第t个点,做一个循环,m种颜色每种都要试试,不符合条件就剪掉
 */
public class pic {
static int x,y,z;
static int grh[][];
static int colors[];

	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		x=sc.nextInt();//节点数
		y=sc.nextInt();//边数
		z=sc.nextInt();//颜色数
		grh=new int[x+1][x+1];
	    colors=new int[x+1];//每个点着色
	    for(int i=1;i<=x;i++) {
	    	colors[i]=0;
	    }
		for(int i=1;i<=y;i++) {
			int start=sc.nextInt();
			int end=sc.nextInt();
			if(start!=end) {
				grh[start][end]=1;
				grh[end][start]=1;
			}
		}//初始化地图
	   backtrace(1,z);

	}

	private static void backtrace(int t, int m) {
		if(t>x) {
			for(int h=1;h<=x;h++) {
				System.out.print(colors[h]+" ");
			}
			System.out.println();
		}else {
			for(int i=1;i<=m;i++) {
				if(check(t,i)==1) {
					colors[t]=i;
					backtrace(t+1,m);
				}
			}
		}
		
	}

	private static int check(int t, int i) {
		for(int k=1;k<t;k++) {
			if(grh[t][k]==1&&colors[k]==i) {
				return 0;
			}
		}
		return 1;
		
	}

}
原文地址:https://www.cnblogs.com/hzcya1995/p/13309595.html