在图中找到至少访问一次X节点的最短电路

时间:2014-06-10 15:06:50

标签: c++ algorithm graph shortest-path

即使我还是初学者,我也喜欢解决与图形相关的问题(最短路径,搜索等)。最近我遇到了这样的问题:

  

给定具有N个节点和E边缘的非定向加权(无负值)图形(两个节点之间最多1个边缘,边缘只能放置在两个不同的节点之间)和X节点列表你必须访问,找到从节点0开始的最短路径,访问所有X节点并返回节点0.总是至少有一条路径连接任意两个节点。

     

限制是1 <= N <= 40 000/1 <&lt; = X&lt; = 15/1&lt; = E&lt; = 50 000

以下是一个例子:

enter image description here

红色节点(0)应该是路径的开始和结束。您必须访问所有蓝色节点(1,2,3,4)并返回。这里最短的路径是:

  

0 - &gt; 3 - &gt; 4 - &gt; 3 - &gt; 2 - &gt; 1 - &gt; 0总成本为30

我想过使用Dijkstra找到所有X(蓝色)节点之间的最短路径,然后贪婪地选择最近的未访问的X(蓝色)节点,但它不起作用(在纸上提出32而不是30) )。我后来也注意到,只找到所有X节点对之间的最短路径将花费O(X * N ^ 2)时间,这个时间太大而节点太多了。

我唯一可以找到的电路是Eulerian电路,它只允许访问每个节点一次(我不需要)。这可以用Dijkstra解决,还是有其他算法可以解决这个问题?

1 个答案:

答案 0 :(得分:2)

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