重新排列图表,以便某些节点不相邻?

时间:2015-02-03 10:29:23

标签: algorithm graph graph-theory

  

编辑:确切地说,我试图在形状像三角形网格的图形中找到两个已知大小的不相交的独立集合,这些图形可能有孔并且具有可变的周长形状。

我不太熟悉图论,所以我不确定这个问题是否存在有效的解决方案。请考虑以下图表:

http://i.imgur.com/Wi5Rfbd.jpg

http://i.imgur.com/0GFzaDl.jpg

http://i.imgur.com/pezW4yk.jpg

可以交换任意两个节点的颜色。目标是确保没有两个红色节点相邻,并且没有两个绿色节点相邻。标有感叹号的边缘无效。基本上,我需要编写两个算法:

  • 确定可以排列给定图形中的节点,使红色和绿色节点不与相同颜色的节点相邻。

  • 实际上重新排列节点。

我对如何实现这一点感到有些失落。分离一种颜色的节点并不太困难,但重复第二种颜色的处理可能会弄乱第一种颜色。如果没有办法确定图表是否能够正确安排,这个过程可能会永远循环。

我可以使用/写入某种算法吗?我主要对第一张图像(三角形网格)感兴趣,但通用算法也可以。

2 个答案:

答案 0 :(得分:4)

首先,让我们注意问题是graph coloring的变体。

现在,如果你只处理2种颜色(红色,绿色) - 用2种颜色着色图表相当容易,基本上是通过找出图形是bipartite并着色每个“边”来完成的。 “一种颜色的图形。查找图表是否为二分图非常简单。

但是,如果您想要两种以上的颜色,则问题变为NP-Complete,实际上是图形着色问题的变体。

图形着色问题:

  

给定图G =(V,E)和数字k确定是否存在   函数c:V->{1,2.,,,.k}使得c(v)= v(u) - > (v,u)不是   边缘。

非正式地,您可以使用k颜色为图表着色,并且您需要确定是否存在某些着色,以便您永远不会为共享具有相同颜色的边缘的2个节点着色。

请注意,虽然看起来你的问题稍微容易一些,但是因为你已经知道每种颜色中的节点数是多少,所以它并没有什么区别。

假设您有一个多项式时间算法A来解决您的问题。
现在,给定一个图形着色的(G,k)实例 - #color1,#color2,#color3只有O(n^3)种可能性 - 所以通过检查每一个并调用A在它上面,你可以找到Graph-Coloring的多项式时间解决方案。这将意味着P=NP,这很可能(根据大多数CS研究人员的说法)并非如此。


<强> TL; DR:

对于2种颜色:找出图表是否为二分图 - 并为图表的每一边提供一种颜色。
对于3种或更多颜色:没有已知的有效解决方案,而且一般认为不存在。

答案 1 :(得分:0)

我认为这个问题对于平面图更容易,但遗憾的是并非如此。我能找到的这个问题的最佳匹配是minimum sum coloringlargest bipartite subgraph

对于最大的二分子图,假设红色数+绿色数与最大二分子图的大小完全匹配。那么这个问题相当于你的问题。论文声称,即使对于平面图,它仍然是NP难的。

对于最小总和着色,假设红色具有权重1,绿色具有颜色2,并且我们具有无限多个蓝色*颜色,具有一些权重>图形尺寸。然后,如果答案恰好是最小和和着色,则没有多项式算法可以找到它(尽管纸张参考这种算法用于弦图)。

无论如何,似乎你的红色+绿色数量越接近最佳状态&#39;在某种意义上的子图中,问题更为棘手。

如果您能够负担得起不精确的解决方案,或者只是放松解决方案,那么您只能说,红色,您可以选择。正如我在评论中所说,平面图的最大独立集问题的近似解。然后将此设置为红色和蓝色,如果它足够大的话。

如果您知道红色+绿色远小于顶点总数,则可以使用另一个近似值。查看this article的介绍章节。它声称:

  

对于承诺具有小色数的图形,更好   保证是已知的:给定一个k-colorable图,一个算法由于   Karger等。 [12]使用半定规划(SDP)来找到   独立的大小约Ω(n /Δ^(1-2 / k))。

您的图表肯定是4色,因此您可以依靠足够大的独立集。同一篇文章指出,贪婪的解决方案已经可以找到足够大的独立集合。