图着色算法

时间:2010-03-15 06:06:56

标签: algorithm colors graph

来自wiki http://en.wikipedia.org/wiki/Graph_coloring

  

以最简单的形式,它是一种方式   着色图的顶点   没有两个相邻的顶点共享   相同的颜色;这叫做a   顶点着色。同样,一个优势   着色为每个边缘分配颜色   这样就没有两个相邻的边共享   相同的颜色,和脸上的颜色   平面图为每个分配颜色   面部或区域,以便没有两个面孔   共享边界的东西是一样的   颜色。

给定'n'颜色和'm'顶点,图形着色的容易程度 算法是用编程语言实现的吗?

语言无障碍。

只是一个脑筋急转弯。

(假设存在图形和顶点对象)

编辑:
阅读维基后,问题是 NP-complete
是时候重温数学书了:) 我的不好。
抱歉。

好奇,
这是否已经尝试过?如同编写程序一样?
我听说这用于光网络?

这不是类似立方体着色吗?
(立方体颜色面的最小颜色数,以便没有两面共用相同的颜色?)

4 个答案:

答案 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种颜色着色。