即使我还是初学者,我也喜欢解决与图形相关的问题(最短路径,搜索等)。最近我遇到了这样的问题:
给定具有N个节点和E边缘的非定向加权(无负值)图形(两个节点之间最多1个边缘,边缘只能放置在两个不同的节点之间)和X节点列表你必须访问,找到从节点0开始的最短路径,访问所有X节点并返回节点0.总是至少有一条路径连接任意两个节点。
限制是1 <= N <= 40 000/1 <&lt; = X&lt; = 15/1&lt; = E&lt; = 50 000
以下是一个例子:
红色节点(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解决,还是有其他算法可以解决这个问题?
答案 0 :(得分:2)
这是一个可能足够快的解决方案:
1)从每个蓝色节点运行最短路径搜索算法(这可以在O(X *(E log N))中完成,以计算成对距离。
2)仅构建一个零顶点和蓝色顶点的新图形(X + 1个顶点)。使用在第一步中计算的成对距离添加边
3)新图形足够小,可以为TSP使用动态编程解决方案(它具有O(X ^ 2 * 2 ^ X)时间复杂度)。