以给定顺序访问一组点的最小成本路径一次?

时间:2013-09-03 09:22:53

标签: algorithm math dijkstra shortest-path breadth-first-search

问题:

我们在2D平面上给出了一组N个点,我们必须找到一个路径,它按照1-2-3 ...... N的顺序访问所有点,然后返回到1,这样就可以节省时间最小化。我们可以向北,东,西或南移动一步,需要1个单位时间。除了1之外我们不能多次访问N点中的一个,我们不能访问超过两次。

N <= 100
每个点的x和y轴是&lt; = 1000000

This是过去USACO比赛中出现的完整问题陈述)

我的算法:

点的x和y轴可以非常大但是只有&lt; = 100点所以,我们改变点的x轴,这样当它们按x轴的升序排列时,它们之间的差异相邻点的x轴为1.对于点的所有y轴,我们都这样做。

现在我们找到从点1到2,从2到3,......以及从N到1的最短路径,而不访问除源和目标之外的任何给定点。我们不能使用简单的bfs来找到最短路径,因为从点x,y到点x + 1,y的距离不是1,而是x + 1的原始值减去x的原始值。所以我使用Dijktra的算法和二进制堆来找到最短的路径。

但是这个算法不适用于testcases的一半,它输出的解决方案大于正确的解决方案。

为什么这个算法错了?我们怎么解决这个问题?

3 个答案:

答案 0 :(得分:2)

  

点的x和y轴可以非常大但是只有&lt; = 100点所以,我们改变点的x轴,这样当它们按x轴的升序排列时,它们之间的差异相邻点的x轴为1.对于点的所有y轴,我们都这样做。

这实质上意味着您删除“未使用”的坐标。但这将耗费你的操作空间。请看以下示例:

4
1 1
3 3
3 2
1 2

这里最短的路径需要8个步骤。假设正x为东,正y为北,则最佳路径为ennESwWS,大写字母表示到达下一个农场。

   /--2
   |  |
4--|--3
|  |
1--/

现在,如果您执行压缩方案,那么您将删除y = 2列,实际上将没有任何列,您可以从农场1传递到农场2,而无需访问农场3或4.所以我看到这种压缩没有收获,但很麻烦。

  

所以我使用了Dijktra的算法

在什么图表上?如果您只在农场使用Dijkstra,那么您将遇到麻烦,因为您必须考虑非农场位置。如果你也采取这些措施,就我所见,事情应该有效。除了前面的压缩。

如果你想保持这个想法,可以做的是将空行或列的连续范围压缩成一个。这样,您的图表将保持相当小(最多201行和每列),但是如果农场周围有空间,那么您的图表将代表这一事实。

我想我会为Dijkstra使用“绕道度量”:让你更接近距离的每一步都是零成本,而带走你的每一步都要花费一个。最后,您可以考虑绕道费用,乘以2(因为您带走的每一步也是您必须朝着目标迈出的一步)并添加终点的曼哈顿距离(这是零迂回成本) )你回来了原来的费用。这基本上是来自A *的想法,但是与Disjkstra的性能(和现有实现)有关。

答案 1 :(得分:1)

如果你压缩这个

..2
...
3.4
...
1..

到这个

.2
34
1.

然后你将路径的长度从1增加到2,因为34构成了一个虚假的障碍。您可以将多个空行/列压缩为一个空行/列而不是无。

答案 2 :(得分:1)

我的想法是:从点i到点i + 1的距离何时不是曼哈顿距离?在我看来,唯一的情况是有一个完整的水平或垂直块(或两者),例如,

        (i+1)                  X    (i+1)           (i+1)
                              X
      XXX XXXX                 X                   XXXX
         X                      X                     X
       i                    i   X                  i  X

我还没有编码任何东西,但也许在计算到下一个点的路线时扫描任一块是有用的,如果块存在则计算最小绕道。