我想解决的问题是:
给定图G =(V,E),使每个边以10种颜色和两种顶点之一着色:s,t。
我需要找到一种算法,该算法可以产生从s到t的(最短)路径,该路径只需要很少的颜色。
我的想法是将图表复制10次:
第一个副本将仅包含一种颜色的边
第二种只包括两种颜色的边缘......依此类推。
此外,我将外部节点:s'连接到每个副本中的每个“s”节点。
但是,我已经想到,对于这种方法,我需要复制图形不是10次,而是大约10次!每种颜色组合(或甚至2 ^ 10?)次。
那么解决这个问题的有效算法是什么?
答案 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并跟踪您访问过的颜色,并且每次访问新颜色时,使用新的较高权重更新整个未访问的图表,从访问过的节点到非访问的节点,这些节点不在使用的颜色集中。