时间:2016-07-28 14:38:23

标签: dynamic-programming shortest-path greedy

给定无向图G,其具有N(1

提示:在每个步骤中,在尚未检查的顶点和找到顶点1的路径的顶点中,取一个具有最短路径的顶点,从顶点1到它,但是找到了。

我在topcoder上发现了这个问题,我认为应该使用Dijkstra的算法,但帖子是关于动态编程的,而Dijkstra是一个贪婪的算法。

任何人都可以告诉我解决这个问题的最佳方法。

由于

1 个答案:

答案 0 :(得分:0)

是的,尽管该问题归类为动态编程,但是您可以使用EITHER动态编程或Dijkstra的“单一来源最短路径”贪婪算法。

贪婪算法有效吗?始终仔细考虑以下两个步骤:

  1. 问您自己的问题是否具有最佳的子结构属性。例如,如果从顶点A到G的最短路径包含B,那么从A到B的路径也必须是最短的。此子结构路径AB是最佳的,因为它本身也是最短的路径。所以是的,您描述的问题是最佳子结构属性。

  2. 该算法是否具有贪婪的选择属性?是最佳解决方案的第一步,是第二步,依此类推。是的,Dijkstra的算法确实具有贪婪选择属性,因为每个顶点都使用指向它的所有顶点的本地信息来“拾取”最小值。该算法只会向前移动而不会向后移动,并且仅当信息是新的(找到距离较短的新顶点B也指向A)并且满足某些条件时,才更改每个顶点A的最小值。

以下是Dijkstra算法的概述:

每个顶点X都有2个分量:当前最短路径和与之关联的指向X的上一个顶点Y。

  1. 将所有顶点当前最短路径设置为无穷大
  2. 设置起点-在这种情况下为1
  3. 对于每个顶点X的相邻顶点Y,Y的当前最短路径是X的最短路径的最小值+两个AND Y的当前最短路径之间的距离。如果更改了Y的当前最短路径,请更新上一个顶点。
  4. 对所有Y的邻居执行相同的操作,依此类推,直到不再有顶点为止。

但是,在您的情况下,您不需要记录prev索引,因为您只需要输出长度即可,或者如果不可能的话。

最后,根据您选择的数据结构,您应该具有某种表/列表,这样,如果您查找某个顶点N,它将告诉您距顶点1的长度。如果距顶点1的长度为无限,那么这是不可能的。当然,您也可以做一些保留每个顶点相关的布尔值的书。

请记住,Dijkstra的运行时间为O(V ^ 2)。动态编程可以产生更快的运行时间。