总之,我建议同时从源矩形上的所有点运行 Dijkstra 算法,并修改停止条件。该算法在搜索过程中跟踪目前找到的当前最低特殊距离,并且不会进一步搜索已经比目前最低特殊距离更远的点。下面的一些伪代码,它使用字典来存储目标点 =>(最佳距离,源点)映射。
enqueue all points on source rectangle
special distance = infinity
while (queue not empty) {
point = dequeue
if (distance to point < best distance found to point AND
distance to point < special distance) {
best distance found to point = distance to point
rect = rectangle of point
if (all points found in rect) {
special distance to this rect = max(distances found to this rect)
if (special distance to this rect < special distance) {
special distance = special distance to this rect
}
}
}
}
激励细节如下:
您可以运行Dijkstra 的算法来查找从源矩形上的每个源点到一组目标点的所有点。本质上,Dijkstra 的算法是广度优先搜索,如果它满足从源点到该点的最短路径的条件,则仅从队列头部的点开始搜索。
如果你使用这个条件,你会找到到所有点的最短路径。然后,您可以计算每个目标矩形的最长距离,并取其中的最小值——该源点的“特殊距离”(然后为源矩形上的每个点重新运行并找到最低的特殊距离)。然而,这是太多的工作,因为您将在搜索中包含许多远离源点且您不需要考虑的点。
您可以做的是保持在算法运行期间找到的当前最低特殊距离,通过发现何时找到矩形的所有点并相应地更新当前最低特殊距离(它从某个高数字开始,如INT_MAX
C )。然后,您可以通过说它们与源点的距离也必须小于当前的最低特殊距离来增加获取点的条件(显然,如果当前点比当前最低特殊距离更远,那么您将无能为力更好地考虑从它引出的路径。)
如果您要为每个矩形寻找特殊点,您可能需要考虑运行Floyd–Warshall 算法,该算法将计算每对点之间的最短距离。