回溯法解决图着色问题Java代码

回溯法解决图着色问题Java代码

(该文作为我的一个学习记录,方便后续回看)

  1. 问题描述
    图的 m- 着色判定问题 —— 给定无向连通图 G 和 m 种不同的颜色。用这些颜色为图 G 的各顶点着色,每个顶点着一种颜色,是否有一种着色法使 G 中任意相邻的 2 个顶点着不同颜色 ?
  2. 思路及代码
    color[n]存储n个顶点的着色方案,可以选择的颜色为1到m。
    当x=1时,对当前第n个顶点开始着色:若x>n,则已求得一个解,输出着色方案即可。否则,依次对顶点x着色1到m, 若x与所有其它相邻顶点无颜色冲突,则继续为下一顶点着色;否则,回溯,测试下一颜色。
    代码如下:
public class graphcolor {
	public static int[][] c=new int[20][20];  //c存储图的邻接矩阵
	public static int[] color=new int[20];    //color表示顶点颜色
	public static int m,n,count=0;  //m--颜色数     n-顶点数   count--方案数
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		n=sc.nextInt();
		m=sc.nextInt();	
		for (int i = 1; i <= n; i++) {
			for (int j = 1; j <= n; j++) {
				c[i][j]=sc.nextInt();
			}
		}
		graphColor(1);         //从第一个顶点开始
		System.out.println(count);
		sc.close();
	}

	public static void graphColor(int x) {
		if (x<=n) {
			for (int i = 1; i <= m; i++) {  
				color[x]=i;           //将这个顶点颜色换为i
				if (isok(x)) {         //检查颜色是否合理
					graphColor(x+1);    //合理即走下一步
				}
				color[x]=0;        //不合理回溯
			}
		}
		else {
			for (int i = 1; i <= n; i++) {
				System.out.print(color[i]+" ");		
			}
			System.out.println();
			count++;
		}	
	}

	public static boolean isok(int x) {
		for (int i = 1; i <= x; i++) {
			if (c[x][i]==1&&color[i]==color[x]) {
				return false;
			}
		}
		return true;
	}

}
  • 6
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值