一·问题描述:给定一个无向连通图G和m种不同的颜色,用这些颜色为图G的各顶点着色,每个顶点一种颜色,使每条边的二个顶点着不同颜色,有多少种着色方案
二·算法描述:
算法策略:回溯法
数据结构:一维数组,二维数组
三·Java代码:
package work2;
import java.util.*;
public class color {
int n;//节点数
int m; // 可用颜色数
int [][]a;//图的邻接矩阵
int x[];//当前解
long sum;
public color(int m,int n,int [][]a)
{
this.m=m;
sum=0;
this.n=n;
this.a=a;
x=new int[n+1];
}
public boolean ok(int k) {
for(int j=1;j<=n;j++) {
if(a[k][j]==1&&x[j]==x[k]) {
return false;
}
}
return true;
}
public 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 void main(String[] args) {
// TODO 自动生成的方法存根
Scanner sc=new Scanner(System.in);
// int n=sc.nextInt();
// int m=sc.nextInt();
// int [][]a=new int[n+1][n+1];
// for(int i=1;i<=n;i++) {
// for(int j=1;j<=n;j++) {
// a[i][j]=sc.nextInt();
// }
// }
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}};
color c=new color(m,n,a);
c.Backtrack(1);
System.out.println(c.sum);
}
}
四。复杂度
时间复杂度:O(n),O()