题目来源:
HihoCoder 1138题目要求:
给定N个小岛的坐标序列:(x1, y2), (x2, y2)...(xN, yN),从(x1, y1)到(xN,yN)之间的最短距离。齐总:两个小岛(xi,yi)和(xj,yj)之间的距离由下面的式子定义:
d(i,j) = min{|xi - xj|, |yi-yj|}
即:两个小岛的距离是他们横坐标和纵坐标差值的较小者。
解答:
这个题目思路还是比较简单的,主要采用dijkstra算法求最短路径。但是,依照题目的描述,任意两个小岛都是可达的, 即图中每个点都有N-1条边和其他的点相连。dijkstra算法的时间复杂度是O(n²)。这样的时间复杂度在运行本题的测试数据时会超时。因此需要对算法进行一定的优化,优化方法如下:
·图优化:
通过对图中的N个点进行排序,可以得到每个点在x方向和y方向上的距离最近的点,如下图:
假设存在一条从s到e的最短路径L = (s, m1, m2, ..., mk, e)不包含任意一个s的最邻近点,则考虑边子路径(s, m1)的长度:
d(s, m1) = min{|s_x - m1_x|, |s_y, m1_y|}
由于m1不是s的最邻近点,所以点s到点m1之间一定存在一个s的最邻近点m0,
以下分两种情况考虑:
(1) 如果d(s, m1) = |d_x - m1_x|,那么点m0一定是s在横轴x方向上的最邻近点,并且m0_x一定介于s_x和m1_x之间,因此:
|s_x - m1_x| = |s_x - m0_x| + |m0_x - m1_x|
如下图所示:

这篇博客详细总结了作者在解决ACM题目HihoCoder1138时的经验,通过排序方法确定图中各点在x轴和y轴上最近的点。博客内容包含具体的距离计算策略和程序代码实现,适用于对算法和图论感兴趣的读者。
最低0.47元/天 解锁文章
1739

被折叠的 条评论
为什么被折叠?



