我不想要这个问题的答案,我只需要朝着正确的方向轻推。
给定具有
G
(N
)个顶点和正权重的无向图1<N<=1000
。找到从顶点1
到顶点N
的最短路径,或说明此路径不存在。提示:在每个步骤中,在尚未检查的顶点和找到顶点
1
的路径的顶点中,从顶点1
获取具有最短路径的顶点。它,但找到了。
首先,我必须定义一个州。这就是我所说的:
状态是顶点
i
的解,其中i <= N
。较小的状态将是j
的解决方案,其中j<i
。要查找州i
,我们需要找到所有较小的州j
(j<i
)。找到i
的最短路径后,我们可以轻松找到下一个状态 -i+1
的解决方案。
我从一个不同的问题中取出了这个,只是替换了变量名和一些单词,因为它听起来适用于这个。
我必须为解决方案编写程序,但我不知道如何开始。以下是我的问题:
我对国家的定义是否正确?
此外,由于这是一个无向图,并且每个顶点都是双向的,权重是否会作为多维数组传递(即int W[N][2]
),其中W[N][0]
是一个权重顶点和W[N][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一起去。