回溯法,图的m着色问题

一·问题描述:给定一个无向连通图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(nm^{n}),O(n^{2})

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值