在图中找到最少彩色的路径

时间:2017-01-29 09:00:05

标签: algorithm shortest-path breadth-first-search np-complete

我想解决的问题是:

给定图G =(V,E),使每个以10种颜色和两种顶点之一着色:s,t。

我需要找到一种算法,该算法可以产生从s到t的(最短)路径,该路径只需要很少的颜色。

我的想法是将图表复制10次:

第一个副本将仅包含一种颜色的边

第二种只包括两种颜色的边缘......依此类推。

此外,我将外部节点:s'连接到每个副本中的每个“s”节点。

但是,我已经想到,对于这种方法,我需要复制图形不是10次,而是大约10次!每种颜色组合(或甚至2 ^ 10?)次。

那么解决这个问题的有效算法是什么?

2 个答案:

答案 0 :(得分:4)

我不相信这是一个简单的算法来解决这个问题,因为问题的一般形式是NP难。也就是说,在任意颜色的图形中,找到触及最小颜色集的两个顶点之间的最短路径是NP难的。

因此,尽管可能会有稍微好一点的算法,但您解决图表的1024种变体(10种颜色的每个子集中一种)的想法可能是合理的。

证明

证明通过减少击中设定问题来起作用。打击设置问题是NP完成,所以减少你的问题表明你的问题是NP难。

回想一下,击中集问题需要设置X1 ... Xn,每个都有来自某个宇宙U的元素,并且要求一个找到一个最小集合{x1,...,xk},这样对于所有i,有&# 39; saj这样xi在Xi。

图中的颜色将是U的元素。让图形本身由n + 1个顶点组成。这些将是X0(一个起始节点,仅为下面的符号方便命名)和顶点代表X1 ... Xn。

对于Xi + 1中的每个x,将Xi连接到Xi + 1,边缘为x。

然后在此图中,从X0到Xn的所有路径都具有长度n,但使用最少数量颜色的路径恰好对应于最小命中集。

请注意,这会扩展图形的定义以包含节点之间的多个边。如果那不行,那么在构造图的每个边缘的中间添加一个额外的节点。

答案 1 :(得分:0)

修改 正如保罗所建议的那样,以下方法不会起作用。

尝试这种方法,我不确定正确性。

首先合并节点,这些节点具有相同的颜色并共享边缘。这将缩小图形,该图形将仅包含边缘(u-> v),其中u和v都具有不同的颜色。

在此之后给图中的所有边赋予恒定的权重。 在图表上运行dijkstra并跟踪您访问过的颜色,并且每次访问新颜色时,使用新的较高权重更新整个未访问的图表,从访问过的节点到非访问的节点,这些节点不在使用的颜色集中。