图m的着色问题

 这个东西初学者,千万别怕,因为我就是。弄懂了你会异常清醒,你的能力潜力不止于此。直接上代码:

	// 图m的着色问题
	public void coloring(int paraNumClolors) {
		//第一步初始化
		int tempNumNodes = connectivityMatrix.getRows();
		int[] tempColorScheme = new int[tempNumNodes];
		Arrays.fill(tempColorScheme, -1);
		
		coloring(paraNumClolors,0, tempColorScheme);
	} // Of coloring

	public void coloring(int paraNumColors, int paraCurrentNumNodes, int[] paraCurrentColoring) {
		// 初始化
		int tempNumNodes = connectivityMatrix.getRows();
		
		System.out.println("coloring: paraNumColors = "+ paraNumColors + ",paraCurrentNumNodes = " + paraCurrentNumNodes +", paraCurrentColoring" + Arrays.toString(paraCurrentColoring));
	
		// 完整的计划
		if(paraCurrentNumNodes >= tempNumNodes) {
			System.out.println("Find one: "+ Arrays.toString(paraCurrentColoring));
			return;
		} // Of if
		
		// 尝试所有可能的颜色
		for(int i = 0;i < paraNumColors;i++) {
			paraCurrentColoring[paraCurrentNumNodes] = i;
			if(!colorConflict(paraCurrentNumNodes + 1,paraCurrentColoring)){
				coloring(paraNumColors,paraCurrentNumNodes+1,paraCurrentColoring);
			} // Of if
		} // Of for i
	} // Of coloring
	
	public boolean colorConflict(int paraCurrentNumNodes, int[] paraColoring) {
		for(int i = 0;i < paraCurrentNumNodes - 1;i++) {
			// 没有直接相连
			if(connectivityMatrix.getValue(paraCurrentNumNodes-1, i) == 0) {
				continue;
			} // Of if
			
			if(paraColoring[paraCurrentNumNodes-1] == paraColoring[i]) {
				return true;
			} // Of if
		} // Of for i
		return false;
	} // Of colorConflict
	
	public static void coloringTest() {
		int[][] tempMatrix = { { 0, 1, 1, 0 }, { 1, 0, 0, 1 }, { 1, 0, 0, 0 }, { 0, 1, 0, 0 } };
		Graph tempGraph = new Graph(tempMatrix);
		//tempGraph.coloring(2);
		tempGraph.coloring(3);
	}// Of coloringTest

分析:我们这里用了三个方法,两个coloring,一个colorConflict,如下是测试图,接下来我们依次分析。

 

测试程序是调用第一个coloring开始的,所以我们从这里讲起

第一步:第一个coloring,传的参数是颜色的种类。然后获取节点数组,在申明一个策略数组(状态空间),初始化Arrays.fill(tempColorScheme,-1),把状态空间没有着色全为-1.然后调用着色函数第二个coloring。

第二步:第二个coloring,参数paraNumColors颜色种类数目(0,1,2,3),paraNumNodes着色的结点(0,1,2,3),paraCurrentColoring目前状态。开始我们依旧获取结点数,然后把需要用的颜色,正在着色的结点打印出来,然后把着色前的状态打印出来。之后我们用一个循环尝试所有的颜色,期间调用一个判断颜色是否合理的方法colorConflict。

第三步:colorConflict(),方法中的参数是下一个结点和颜色数组。首先进行一个for循环,第一个 if 判断是下一个结点不相邻,就跳过。第二个 if 如果这个结点与前面结点相邻,并且颜色相同,返回true。回溯到第二步的coloring  中 if (!colorConflict(paraCurrentNodes + 1,paraCurrenColoring)) 即 !ture 不执行,说明颜色重复了,另选颜色。 返回false,!false为真执行下一个结点的着色(递归调用)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值