给定图的邻接矩阵,我需要获得chromatic number(绘制图的每个节点所需的最小颜色数,以便相邻节点获得不同的颜色)。
最好是java算法,我不关心性能。
感谢。
编辑: 最近推出了一个修复,所以答案更准确。现在它将重新检查他以前的职位。
public class Modelacion {
public static void main(String args[]) throws IOException{
// given the matrix ... which i have hidden the initialization here
int[][] matriz = new int[40][40];
int color[] = new int[40];
for (int i = 0 ; i<40;i++)
color[i]=1;
Cromatico c = new Cromatico(matriz, color);
}
}
import java.io.IOException;
public class Cromatico {
Cromatico(int[][]matriz, int[] color, int fila) throws IOException{
for (int i = 0; i<fila;i++){
for (int j = 0 ; j<fila;j++){
if (matriz[i][j] == 1 && color[i] == color [j]){
if (j<i)
color [i] ++;
else
color [j] ++;
}
}
}
int numeroCromatico = 1;
for (int k = 0; k<fila;k++){
System.out.print(".");
numeroCromatico = Math.max(numeroCromatico, color[k]);
}
System.out.println();
System.out.println("el numero cromatico del grafo es: " + numeroCromatico);
}
}
答案 0 :(得分:1)
超级慢,但它应该有效:
int chromaticNumber(Graph g) {
for (int ncolors = 1; true; ncolors++) {
if (canColor(g, ncolors)) return ncolors;
}
}
boolean canColor(Graph g, int ncolors) {
return canColorRemaining(g, ncolors, 0));
}
// recursive routine - the first colors_so_far nodes have been colored,
// check if there is a coloring for the rest.
boolean canColorRemaining(Graph g, int ncolors, int colors_so_far) {
if (colors_so_far == g.nodes()) return true;
for (int c = 0; c < ncolors; c++) {
boolean ok = true;
for (int v : g.adjacent(colors_so_far)) {
if (v < colors_so_far && g.getColor(v) == c) ok = false;
}
if (ok) {
g.setColor(colors_so_far, c);
if (canColorRemaining(g, ncolors, colors_so_far + 1)) return true;
}
}
return false;
}
答案 1 :(得分:1)
查找图的色数是NP-Complete(参见Graph Coloring)。即使确定给定的图形是否是可着色的(并且还要找到着色),它也是NP完全的。
上一段链接到的wiki页面有一些你可以使用的算法描述。
顺便说一下,因为它是NP-Complete并且你并不真正关心性能,为什么不尝试使用暴力?猜测色数k,尝试顶点着色的所有可能性(最大k ^ n种可能性),如果它不可着色,则对色数的新猜测= min {n,2k}。如果它是k可着色的,则对色数的新猜测= max {k / 2,1}。按照二分查找使用的模式重复,找到最佳k。
祝你好运!并回答你的编辑。
任何增加颜色的选项都不起作用。此外,您的算法是O(n ^ 2)。这本身足以说明你的算法极有可能是错误的,即使没有寻找反例。这个问题是NP-Complete!