题目:
题目描述
给定无向连通图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;
}
}