这个东西初学者,千万别怕,因为我就是。弄懂了你会异常清醒,你的能力潜力不止于此。直接上代码:
// 图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为真执行下一个结点的着色(递归调用)