algorithm - 为什么顶点着色是 NP-hard?

标签 algorithm graph-algorithm np-hard

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

这两者如何结合?你能给点灯吗?

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

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

据说 BFS 方法仅适用于 2 种颜色。我明白为什么上述技术不能用于超过 2 种颜色

最佳答案

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

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

enter image description here

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

enter image description here

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

关于algorithm - 为什么顶点着色是 NP-hard?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21798823/

相关文章:

algorithm - 聚类和匹配有什么区别?

algorithm - 在推理图中查找第一个 UIP

c# - 如何找到一组中的哪些数字加起来与另一个给定数字相加?

algorithm - 显示不相交哈密顿路径的 np-完整性

algorithm - 对角簇的 K-Means

javascript - 存储用户测验/测试答案的正确方法是什么?

algorithm - UVA OnlineJudge 507 - Jill Rides Again 错误答案

algorithm - DAG 中多个节点的最小公共(public)祖先

c++ - 在真实 3D 环境(例如建筑物)中寻路

algorithm - 证明不存在这样的算法