交互式图论学习
交互式图论学习
Guest User
Using app without sign in
图着色与色数求解器
为顶点着色使相邻顶点不共享相同颜色
选择算法并生成步骤以开始可视化
图着色为顶点分配颜色,使相邻两顶点颜色不同,并尽量少用颜色。所需的最少颜色数是色数,对一般图而言计算它是 NP 难的。
贪心算法对顶点排序,给每个顶点分配其已着色邻居未用的最小颜色,保证颜色数至多比最大度大一。诸如 Welsh-Powell(按度递减)或 DSatur(按饱和度,即不同邻居颜色的数量)的排序在实践中往往用色少得多。精确着色使用带剪枝的回溯,仅对小图可行。
着色可安排考试使无学生同时有两场、在编译器中分配 CPU 寄存器、无干扰地分配无线电频率,并为地图着色使相邻区域不同。平面图的四色定理是数学中最著名的成果之一。二部性检查恰是 2-可着色性。
贪心着色只有三行,而且总能给出一种合法的着色。它不保证给出的是最少颜色数,而结点的处理顺序决定了它能接近到什么程度。
贪心着色(图, 顺序):
颜色 = {}
对 顺序 中的每个结点 v:
已用 = { 颜色[n] : n 是 v 的邻居且已着色 }
c = 不在 已用 中的最小正整数
颜色[v] = c
返回 颜色
// Welsh-Powell:按度数从大到小排序
// DSatur:反复选取未着色结点中邻居颜色种类最多的那个
// (饱和度最高),并以度数打破并列贪心用到的颜色永远不超过最大度加一,因为轮到某个结点时,它至多有那么多邻居,因此至多有那么多被禁用的颜色。这是一条真实的保证,但它可能离真正的色数很远。DSatur 是务实的改进:优先处理约束最多的结点,正是这条启发式让你不至于把自己逼进死角。
按字母顺序对一个五元环做贪心着色,再把结果与真正的色数对照。
示例图: 无向环 A-B、B-C、C-D、D-E 和 E-A。
着色结果为 A 1、B 2、C 1、D 2、E 3,共用三种颜色;穷举验证表明五元环的色数确实就是 3。这里贪心恰好是最优的。之所以需要三种颜色,是因为这个环的长度为奇数:沿环着色必须交替,而奇环会把你带回起点,并要求那里换一种与已有不同的颜色。任何偶环都只需 2 种。
时间: 贪心 O(V + E),精确求解 NP 困难 · 空间: O(V)
贪心着色对每个结点只考察一次,对每条边从两个端点各检查一次,因此是 O(V + E),颜色数组占 O(V) 空间。这点代价换来的是一种合法着色,所用颜色不超过最大度加一,但绝不保证最少。计算真正的色数是 NP 困难的;即便只想把它近似到 V 的 1 减 epsilon 次方这个因子之内,同样是 NP 困难的,这个结论异常之强:多数问题都还有某种像样的近似,而着色问题基本上没有。判定二着色是个例外,而且很容易,因为它恰好就是 O(V + E) 的二分性检测。判定三着色则已经是 NP 完全的了。
根据你预期需要多少种颜色,以及是否非要真正的最小值来选择。
| 替代算法 | 以下情况更合适 | 代价 |
|---|---|---|
| 二分性检测 | 你只想知道两种颜色够不够。这是另一个而且容易得多的问题。 | O(V + E) |
| DSatur 算法 | 务实的默认选择。优先取饱和度最高的结点,在真实图上往往最优或接近最优。 | O(V^2) |
| Welsh-Powell 算法 | 你几乎不想多写代码,又想比任意顺序更好。按度数从大到小排序即可。 | O(V^2) |
| 精确分支定界 | 你确实需要色数,而且图不大。 | 指数级 |
| 最大团 | 你想要一个下界。规模为 k 的团至少迫使使用 k 种颜色。 | O(3^(V/3)) |