我遇到了以下问题:
给定平面上的点P = {(x1,y1),(x2,y2),...,(xn,yn)}的集合,找到具有以下属性的最短路径:
我们可以假设所有点都有不同的x坐标。
Aditionaly我假设每个点只能访问一次(但我不确定它是否不符合上述属性)。
我开发了以下算法:
1. sort points in P by the x coordinate
2. start two paths in the left most point L
3. for each p in P:
4. extend path that has last point closest to p
5. connect shorter path with R with edge X
但事实证明这是错误的。路径可以相交,当它们相交时,总会有更好的路径,可以通过切换相交段的端点来构造。怎么解决?
答案 0 :(得分:2)
正如David Eisenstat所提到的,你需要在每个点上进行最短的比特游。
这可以通过O(n ^ 2)时间内的动态编程来完成。
让Pij (1 <= i <= j <= n)
成为从pi
到pj
的双向路径,以便路径从pi
开始,严格保留到p1
,然后去在pj
左侧的所有点的过程中,pj
严格正确。
让d[i,j]
为从i
到j
的最短路径的长度。
Note that d[1,2] = dist(p1,p2)
d[1,3] = d[1,2] + dist(p2,p3).
d[i,j] = d[i,j-1] + dist(j-1,j) for i < j-1.
d[j-1,j] = min( d[k,j-1] + dist(k,j) ) for 1 <= k < j-1
您可以使用上述重复关系找到d[n,n]
。
构建这个2-D矩阵需要O(n ^ 2)时间