Algorithm 给定图的k-着色';s顶点计算(k-1)-着色

Algorithm 给定图的k-着色';s顶点计算(k-1)-着色,algorithm,optimization,recursion,np-complete,graph-coloring,Algorithm,Optimization,Recursion,Np Complete,Graph Coloring,众所周知,图的着色顶点是NP完全的。 众所周知,有一些高效的贪婪算法可以得到近似解。 为什么不使用这些随机贪婪算法来计算具有k个颜色的着色,然后使用一些较慢的算法来减少k 在我的情况下,我知道足够给图G着色的最小颜色数——我们称之为K。我还设法实现了SL算法,它给了我(K+2)着色。一种颜色只用于给一个顶点上色,所以我通过手动重新着色其他节点来移除它。因此,我有(K+1)-着色,我想写一个算法,将K(或者更确切地说是K+1)减少1 我尝试过手动操作-我找到了一种颜色,该颜色用于相同颜色的最小顶点

众所周知,图的着色顶点是NP完全的。 众所周知,有一些高效的贪婪算法可以得到近似解。 为什么不使用这些随机贪婪算法来计算具有k个颜色的着色,然后使用一些较慢的算法来减少k

在我的情况下,我知道足够给图G着色的最小颜色数——我们称之为K。我还设法实现了SL算法,它给了我(K+2)着色。一种颜色只用于给一个顶点上色,所以我通过手动重新着色其他节点来移除它。因此,我有(K+1)-着色,我想写一个算法,将K(或者更确切地说是K+1)减少1

我尝试过手动操作-我找到了一种颜色,该颜色用于相同颜色的最小顶点数,并将该颜色的使用减少到3。我只需要重新调用3个节点

一个想法是进行3次递归调用——每个颜色不好的节点调用一次。让我们分析一下递归函数对节点v必须做什么。它必须检查每种颜色,除了v的颜色和我们想要去除的颜色。因此,对于每个颜色c,它应该将v的颜色设置为c,并对每个节点进行递归调用,该节点是v的邻居,并且具有颜色c。检查完所有颜色后,我们应该检索v的旧颜色并重新设置。另外一个优化可能不是试图将v的颜色更改为比x多的邻居的颜色(因为递归树太深),但对于太小的x,它可能根本无法更改颜色

另一个想法是检查颜色可以更改的节点(而不是我们想要删除的颜色),这样它就不会与邻居的颜色冲突。并进行递归调用以更改其他节点的颜色,直到要移除的一种颜色被重新着色

下面是我对第一个算法的实现,该算法原本打算在n<90时工作,但似乎没有结束(执行500分钟):

#包括
#包括
#包括
使用名称空间std;
向量图[99];
int散列[10009],颜色[99];
常数int colors=9,颜色变化=7;
无效更改颜色(int v)
{
int tmp=颜色[v],计数;

对于(int i=1;i我只是简单地看了一下代码,并阅读了您的解释,但您似乎进入了一个在邻居之间来回切换的无限循环。您需要在每个节点中存储一个标志,以注意它当前正在被重新调用,并且只递归到那些当前未被重新调用的邻居

3 colour version  :  R-G-R-G-R-G-(B)-R-G-R-G-R-G-R
2 colour version 1: [R-G-R-G-R-G- R]-G-R-G-R-G-R-G
2 colour version 2:  G-R-G-R-G-R-[G -R-G-R-G-R-G-R]
然而,在最坏的情况下,这个算法看起来像是指数算法。我很确定,在某些情况下,如果不改变图的大部分,K-彩色图就不能重新生成K-1图,即使K-彩色图的节点数只有1

这是一个拓扑结构简单的示例图。很明显,它可以是两种颜色(R,G),我们有一个使用(R,G,B)的三色版本。正确地重新绘制它的唯一方法是更改大约1/2的节点颜色,最后是下面的其他版本之一。
()
表示颜色B的单个节点,而
[]
表示需要重新查找的部分

3 colour version  :  R-G-R-G-R-G-(B)-R-G-R-G-R-G-R
2 colour version 1: [R-G-R-G-R-G- R]-G-R-G-R-G-R-G
2 colour version 2:  G-R-G-R-G-R-[G -R-G-R-G-R-G-R]

这意味着(可能是指数)搜索的最小深度可能超过节点数的1/2。这可能会缩短合理的性能时间(或者可能不取决于我猜的图的拓扑)。

这仍然是NP难的。你能指定你在寻找哪种解决方案吗?它是NPH,但对于像我这样的小图(n<90),一些条件将减少递归树和需要更改的少量节点,也许可以实现着色(我知道是这样).您是否考虑过使用通用SAT或ILP解算器?是的,但这在SPOJ上是个问题,编写解决方案比仅将图形粘贴到程序中更令人满意。尤其是如此接近实际解决方案。但感谢您提及。谢谢。现在它立即完成。即使在删除“计数<4”之后条件。它以错误的方式给图形着色-一些邻居有相同的颜色,但现在我有了调试它的基础。至于时间复杂度,我知道它是指数的,并且将始终是指数的。否则问题就不会是NP完全的。