动态编程的最短路径

时间:2016-04-25 01:32:16

标签: c dynamic-programming

我不想要这个问题的答案,我只需要朝着正确的方向轻推。

  

给定具有GN)个顶点和正权重的无向图1<N<=1000。找到从顶点1到顶点N的最短路径,或说明此路径不存在。

     

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

首先,我必须定义一个州。这就是我所说的:

  

状态是顶点i的解,其中i <= N。较小的状态将是j的解决方案,其中j<i。要查找州i,我们需要找到所有较小的州jj<i)。找到i的最短路径后,我们可以轻松找到下一个状态 - i+1的解决方案。

我从一个不同的问题中取出了这个,只是替换了变量名和一些单词,因为它听起来适用于这个。

我必须为解决方案编写程序,但我不知道如何开始。以下是我的问题:

  1. 我对国家的定义是否正确?

  2. 此外,由于这是一个无向图,并且每个顶点都是双向的,权重是否会作为多维数组传递(即int W[N][2]),其中W[N][0]是一个权重顶点和W[N][1]另一个的重量?

  3. 如何表示最短路径?它是采用的路径数,所采用路径的所有权重之和,还是所有路径权重的数组?

1 个答案:

答案 0 :(得分:1)

您是否考虑过All-Pairs Shortest Paths算法?例如, Floyd-Warshall算法可以作为您问题的可能解决方案。

Floyd-Warshall算法是一种动态编程算法。 Floyd-Warshal算法也支持有向图,因此也是无向的。

Floyd-Warshall的时间复杂度为Θ(| V | ^ 3),空间复杂度为Θ(| V | ^ 2)

维基百科链接 https://en.wikipedia.org/wiki/Floyd%E2%80%93Warshall_algorithm

C实施 http://www.c-program-example.com/2011/10/c-program-to-implement-warshalls.html

找到路径可以留作练习 此链接有一个如何完成它的示例,但您需要将其翻译为C.您可以在前任矩阵下找到它 http://www.programming-algorithms.net/article/45708/Floyd-Warshall-algorithm

这似乎是算法的一个很好的视觉表示 https://www.cs.usfca.edu/~galles/visualization/Floyd.html

另一种方法是 Bellman Ford算法。这不是所有对最短路径,而是计算从单个点到所有其他顶点的最短路径。

Bellman-Ford算法是一种动态编程算法。 Bellman-Ford算法也支持加权有向图,因此也是无向的。

Bellman-Ford的时间复杂度为Θ(| V || E |),空间复杂度为Θ(| V |)

维基百科链接 https://en.wikipedia.org/wiki/Bellman%E2%80%93Ford_algorithm

C实施 http://www.cs.dartmouth.edu/~cs57/Project/bellman-ford.c

在您的情况下(假设空间复杂度不是问题)在两者之间进行选择主要取决于与边数相比的顶点数。通常如果| E |比(| V | ^ 2)大得多,那么你应该选择Warshall-Floyd,否则如果(| V | ^ 2)比| E |大得多。你应该和Bellman-Ford一起去。

相关问题