给定无向图G,其具有N(1 提示:在每个步骤中,在尚未检查的顶点和找到顶点1的路径的顶点中,取一个具有最短路径的顶点,从顶点1到它,但是找到了。 我在topcoder上发现了这个问题,我认为应该使用Dijkstra的算法,但帖子是关于动态编程的,而Dijkstra是一个贪婪的算法。 任何人都可以告诉我解决这个问题的最佳方法。 由于
答案 0 :(得分:0)
是的,尽管该问题归类为动态编程,但是您可以使用EITHER动态编程或Dijkstra的“单一来源最短路径”贪婪算法。
贪婪算法有效吗?始终仔细考虑以下两个步骤:
问您自己的问题是否具有最佳的子结构属性。例如,如果从顶点A到G的最短路径包含B,那么从A到B的路径也必须是最短的。此子结构路径AB是最佳的,因为它本身也是最短的路径。所以是的,您描述的问题是最佳子结构属性。
该算法是否具有贪婪的选择属性?是最佳解决方案的第一步,是第二步,依此类推。是的,Dijkstra的算法确实具有贪婪选择属性,因为每个顶点都使用指向它的所有顶点的本地信息来“拾取”最小值。该算法只会向前移动而不会向后移动,并且仅当信息是新的(找到距离较短的新顶点B也指向A)并且满足某些条件时,才更改每个顶点A的最小值。
以下是Dijkstra算法的概述:
每个顶点X都有2个分量:当前最短路径和与之关联的指向X的上一个顶点Y。
但是,在您的情况下,您不需要记录prev索引,因为您只需要输出长度即可,或者如果不可能的话。
最后,根据您选择的数据结构,您应该具有某种表/列表,这样,如果您查找某个顶点N,它将告诉您距顶点1的长度。如果距顶点1的长度为无限,那么这是不可能的。当然,您也可以做一些保留每个顶点相关的布尔值的书。
请记住,Dijkstra的运行时间为O(V ^ 2)。动态编程可以产生更快的运行时间。