没有Dijkstra的最短路径

时间:2014-07-03 04:05:01

标签: c++ algorithm

我需要一些关于如何解决以下问题的想法(不是解决方案)。 所以有一个人需要到达建筑物右上角的电话。保证他们将在那个位置。我们必须找到他能够到达那里的最短路径。有关示例,请参见图像。

首先想到的是使用Dijkstra的算法。但是,我被告知这是不必要的,并且有更简单的替代方案。

另一方面,如果它是最后的选择,如果有人可以指导我,我不会介意使用Dijkstra的算法。我对图论没有太多的先验知识,尽管我能胜任我使用的语言(C ++)。

Staircase

说明: 他把自动扶梯从一楼的左侧带到一楼的右侧(14秒); 他从右侧向左冲刺一楼(5秒); 他把自动扶梯从一楼的左侧带到二楼的右侧(13秒); 他将自动扶梯从二楼右侧带到顶层左侧(11秒); 他从顶层的左侧跑到右侧(5秒钟)来接听电话! 从前门到售楼处的总时间为14 + 5 + 13 + 11 + 5 = 48秒。

输入将按以下格式指定: 每行每行包含由单个空格分隔的三个整数lfr,其中l表示从当前楼层的左侧到楼层右侧所需的秒数,f表示从从地板的一侧延伸到另一侧,以及从地板的右侧到地板的左侧行进的秒数。

示例输入:

14 10 15

13 5 22

13 7 11

5

2 个答案:

答案 0 :(得分:2)

这是一个DP问题。

f[n][left] = min{f[n-1][left] + time[go_from_left_to_right_on_floor_n-1] + time[escalator_from_right_side_up],
                 f[n-1][right] + time[escalator_from_right_side_up]}

f[n][right] = min{f[n-1][right] + time[go_from_right_to_left_on_floor_n-1] + time[escalator_from_left_side_up],
                 f[n-1][left] + time[escalator_from_left_side_up]}

如果你想去左边的三楼,你可以从二楼开始,左侧,右侧,然后乘坐自动扶梯;或从二楼开始,右侧,乘坐自动扶梯。选择使用最少时间的方式,并继续使用循环(或递归:))

解决方案应为 O(n)

答案 1 :(得分:-1)

如果问题与你发布的问题一样小,我猜choyukchow的答案会有效。 但是如果问题变得非常大,你可能想要使用启发式算法。示例here