来自wiki http://en.wikipedia.org/wiki/Graph_coloring
以最简单的形式,它是一种方式 着色图的顶点 没有两个相邻的顶点共享 相同的颜色;这叫做a 顶点着色。同样,一个优势 着色为每个边缘分配颜色 这样就没有两个相邻的边共享 相同的颜色,和脸上的颜色 平面图为每个分配颜色 面部或区域,以便没有两个面孔 共享边界的东西是一样的 颜色。
给定'n'颜色和'm'顶点,图形着色的容易程度 算法是用编程语言实现的吗?
语言无障碍。
只是一个脑筋急转弯。
(假设存在图形和顶点对象)
编辑:
阅读维基后,问题是 NP-complete
是时候重温数学书了:)
我的不好。
抱歉。
好奇,
这是否已经尝试过?如同编写程序一样?
我听说这用于光网络?
这不是类似立方体着色吗?
(立方体颜色面的最小颜色数,以便没有两面共用相同的颜色?)
答案 0 :(得分:8)
这是NP完全问题,请阅读Wikipedia entry以获取有关各种解决方法的更多信息。
答案 1 :(得分:4)
如果给你2种颜色,并且图形是2可着色的(即它是bipartite graph),那么你可以在多项式时间内完成这一操作。
我给出了一个伪代码来回答这个问题:Graph colouring algorithm: typical scheduling problem。
答案 2 :(得分:2)
在我的硕士论文中,我测试着色算法。最简单的算法是 Edge Backtrace 。
这是我在Java中的实现:
public boolean edgeBackTrace (List<Edge<T>> edgesList, Map<Edge<T>, List<Edge<T>>> neighborEdges) {
for (Edge<T> e : edgesList) {
e.setColor(0);
}
int i = 0;
while (true){
Edge<T> edge = edgesList.get(i);
edge.setColor(edge.getColor() + 1);
if (edge.getColor().equals(4)) {
edge.setColor(0);
if (i == 0) {
return true;
} else {
i--;
}
} else {
boolean diferentColor = false;
for (Edge<T> e : neighborEdges.get(edge)) {
if (e.getColor().equals(edge.getColor())) {
diferentColor = true;
}
}
if (diferentColor == false) {
i++;
if (i == edgesList.size()) {
return false;
}
}
}
}
}
如果图形具有着色,则算法返回值true。您可以在 edgesList 中看到颜色,单个边缘。
答案 3 :(得分:1)
如上所述,一般问题是np-complete。可以仅使用2种颜色对二分图进行着色。
根据Kuratowski定理,平面图(不包含K3,3 or K5作为子图的图形)也可以用4种颜色着色。