老实说,我不敢相信这还没有被问到,但这是
背景
给定一个简单的无向平面(该图可以在没有相交的平面上绘制)图,这是一个证明定理,即该图是4色的,这是我们稍后将要探讨的术语。但是,对图形进行5色绘制要容易得多,这就是我们今天要重点解决的问题。
图的有效k着色是对具有以下属性的图的节点分配“颜色”
- 如果两个节点通过一条边连接,则这些节点将使用不同的颜色进行着色。
- 在整个图形中,最多有5种颜色。
鉴于此,我将向您展示一个非常基本的算法,以对任何简单的无向平面图进行5种颜色着色。该算法需要以下定义
可达性:如果节点1可从节点2到达,则意味着存在一系列节点,每个节点通过一条边连接到下一个节点,因此第一个节点是节点2,最后一个节点是节点1。请注意,由于无向图是对称的,如果节点1可从节点2到达,则节点2可从节点1到达。
子图:给定节点集的图的子图N是其中子图的节点全部在N中的图,并且当且仅当两个节点都通过边连接时,原始图的边才在子图中在北
假设Color(N)是为带有5种颜色的N个节点的平面图着色的函数。我们在下面定义函数
- 查找连接的节点数最少的节点。该节点最多连接5个节点。
- 从图中删除该节点。
- 在此新图形上调用Color(N-1)对其进行着色。
- 将已删除的节点添加回图。
- 如果可能,请为添加的节点上色,使其所连接的节点都没有该颜色。
- 如果不可能,则添加节点的所有5个相邻节点都有5种不同的颜色,因此我们必须尝试以下过程。
- 编号添加节点n1 ... n5周围的节点
- 考虑原始图中所有节点的子图,其颜色与n1或n3颜色相同。
- 如果在此子图中,无法从n1到达n3,则在从n1(包括n1)可到达的节点集中,将所有出现的n1颜色替换为n3,反之亦然。现在为添加的节点n1的原始颜色上色。
- 如果在此新图中从n1可以到达n3,请在节点n2和n4而不是n1和n3上从步骤9开始执行过程。
挑战
给定边列表的输入(代表图形),通过为每个节点分配一个值来为图形着色。
输入:图形中边的列表(即[('a','b'),('b','c')...]
)
请注意,输入边列表将使得如果(a,b)在列表中,而(b,a)不在列表中。
输出:包含对值,其中每对的第一个元素是一个节点的一个目标,并且所述第二颜色,即[('a',1),('b',2)...]
或{'a':1,'b':2,...}
您可以使用任何东西来代表颜色,从数字到字符,再到其他。
输入和输出非常灵活,只要它很清楚输入和输出是什么即可。
规则
- 这是一个代码高尔夫挑战
- 您不必使用我上面描述的算法。它只是那里供参考。
- 对于任何图形,通常有许多有效的着色方法。只要算法产生的着色有效,就可以接受。
- 请记住,图表必须是5色。
测试用例
使用以下代码测试着色结果的有效性。由于每个图形有许多有效的图形着色,因此该算法仅检查着色的有效性。请参阅文档字符串以了解如何使用代码。
一些随机(相当愚蠢)的测试用例:
测试案例2:Krakckhardt风筝图
[(0, 1), (0, 2), (0, 3), (0, 5), (1, 3), (1, 4), (1, 6), (2, 3), (2, 5), (3, 4), (3, 5), (3, 6), (4, 6), (5, 6), (5, 7), (6, 7), (7, 8), (8, 9)]
有效输出:
{0: 4, 1: 3, 2: 3, 3: 2, 4: 4, 5: 1, 6: 0, 7: 4, 8: 3, 9: 4}
注意:这些测试用例太小,无法测试着色算法更细微的行为,因此构造自己的图形可能是对工作有效性的良好测试。
注意2:我将添加另一段代码,以很快显示您的着色解决方案。
注3:我没有预见到已经提出的随机着色算法,这对PPCG来说真是太酷了!但是,如果有人可以使用一种更具确定性的算法,那也将非常酷。
5
为4
,然后重新提交。