查找一张图中至少访问X个节点的最短回路。

7
尽管我还是个新手,但我喜欢解决与图相关的问题(最短路径、搜索等)。最近我遇到了这样一个问题:
给定一个非定向、加权(没有负值)的图,具有N个节点和E条边(两个节点之间最多只有1条边,一条边只能放在两个不同的节点之间),以及一个必须访问的X节点列表,找到从节点0开始、访问所有X节点并返回节点0的最短路径。任意两个节点之间都至少有一条路径。
限制条件为:1 <= N <= 40,000 / 1 <= X <= 15 / 1 <= E <= 50,000
这里有一个例子:
红色节点(0)应该是路径的起点和终点。你必须访问所有蓝色节点(1、2、3、4)并返回。这里的最短路径将是:
0 -> 3 -> 4 -> 3 -> 2 -> 1 -> 0,总花费为30。
我考虑使用Dijkstra算法来找到所有X(蓝色)节点之间的最短路径,然后贪心地选择最近未访问的X(蓝色)节点,但它不起作用(在纸上得到的结果是32而不是30)。我后来注意到,仅仅找到所有X节点对之间的最短路径将需要O(X*N^2)的时间,这对于这么多节点来说太大了。
我能找到的唯一关于电路的东西是欧拉电路,它只允许访问每个节点一次(我不需要那个)。这个问题可以用Dijkstra解决吗?还是有其他算法可以解决这个问题?

1
你需要一个精确的答案,还是一个近似的答案对你也可以? - templatetypedef
http://en.wikipedia.org/wiki/Travelling_salesman_problem 可能会有用。 - Jarod42
它肯定是NP难问题,因为TSP可以被归约到它,所以你的图必须很小。 - Niklas B.
@A.Andevski 好的,我的错 :-/ - Ante
找到每对X节点之间的最短路径是X(X-1)/ 2 * O(E + N logN)。由于X(X-1)/ 2 <= 105 << N logN,并且E〜N,因此它是O(N logN)。之后,在至多15个节点的完全图上进行标准TSP。 - Ante
显示剩余4条评论
1个回答

2

以下是可能足够快的解决方案:
1)从每个蓝色节点运行最短路径搜索算法(这可以在O(X *(E log N))内完成),以计算成对距离。
2)构建一个新图,其中仅包含零点和蓝点(X + 1个顶点)。使用第一步计算出的成对距离添加边缘。
3)新图足够小,可以使用动态规划解决TSP问题(时间复杂度为O(X ^ 2 * 2 ^ X))。


我如何在O(X * (E log N))中完成第一步?使用Dijkstra算法,我的代码在N = 36786 / X = 15 / E = 40493的情况下大约需要240秒才能完成。 - A. Andevski
2
你可以使用带有优先队列的Djikstra算法。 - kraskevich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接