【问题标题】:Why Is vertex coloring NP-hard?为什么顶点着色是 NP 难的?
【发布时间】:2014-02-15 14:29:18
【问题描述】:

我正在阅读顶点着色算法。我看到解释如何使用 BFS 解决问题的文档(暗示问题可以在 O(|V|+|E|) 中解决。但我也看到它提到这是一个 NP-hard 问题。

这两者如何结合在一起?能不能给点灯?

这是我遇到的算法,对我来说它看起来像是一般情况下的多项式解决方案:

用数字标识每种颜色。从一个节点开始,并为其分配编号最少的颜色。使用 BFS 访问其每个邻居。在访问一个节点时,检查它的每个邻居的颜色,并分配没有分配给任何邻居的最小编号的颜色。

据说 BFS 方法仅适用于 2 种颜色。我可以理解为什么上述技术不适用于超过 2 种颜色

【问题讨论】:

    标签: algorithm graph-algorithm np-hard


    【解决方案1】:

    通常,当我想到面包优先搜索 (BFS) 时,我认为它适用于树,但顶点着色是一个图问题,而不是树问题。我想您可以通过采用在移动到不同节点之前标记与当前节点相邻的所有节点的规则来将 BFS 应用于图形。

    首先,看一个基本示例,说明使用最小数字排序(称为顺序排序)的简单标记如何不起作用:

    如果我们按顺时针顺序(A 到 J)标记节点,我们最终会得到 4 种颜色,而实际上该图具有 2 种颜色。现在,您的规则,优先标记相邻节点将起作用,因为它是两种颜色。但是,您的规则不适用于 3 种颜色,例如:

    在这个例子中,我们选择A作为“树”的根,并首先做它的孩子B和C。然后,我们选择孩子B,因为它的字母顺序低于C,并且是B 的所有孩子。我们最终得到了 4 色,而实际上图形可以是 3 色的。

    【讨论】:

      【解决方案2】:

      顶点着色的一种特殊情况,或者近似值可以使用 BFS 来实现。一般问题是 NP-Complete,BFS 无法解决所有情况。我很想尝试提供一个反例,但是缺少您对算法的描述-着色策略不清楚。

      例如,BFS 可实现的简单着色是c(v) = d(source,v)(这里c(v) 是颜色,d(source,v) 是从源到顶点的距离,由 BFS 检索)。
      很容易看出这对于A--B--C--D 不是最优的,你可以用 2 种颜色给它上色,但这个解决方案使用 4 种颜色。

      【讨论】:

      • BFS 的特殊情况是根据Wikipedia 进行 2 着色(但大概它也可以作为一般情况的近似值)。
      • @amit 这是我遇到的算法,对我来说它看起来像是一个一般情况下的多项式时间解决方案 - 每种颜色都由一个数字标识。从一个节点开始,并为其分配编号最少的颜色。使用 BFS 访问其每个邻居。在访问一个节点时,检查它的每个邻居的颜色,并分配没有分配给任何邻居的最小编号的颜色。我可以理解为什么这不适用于超过 2 种颜色
      • @Aadith 这是一种贪心算法,并且在大多数图表上需要比所需颜色更多的颜色方面并不理想
      【解决方案3】:

      使用 BFS 的算法解决了颜色数量不固定的顶点着色问题的宽松情况,它有时可以作为一般 NP 完全问题的近似解决方案,使用 k 种颜色为图形着色或找到最小集可用于为图形着色的颜色

      【讨论】:

        猜你喜欢
        • 2013-05-14
        • 1970-01-01
        • 1970-01-01
        • 2013-12-10
        • 1970-01-01
        • 2018-03-15
        • 1970-01-01
        • 2013-03-15
        • 1970-01-01
        相关资源
        最近更新 更多