ACM解题总结——HihoCoder1138

这篇博客详细总结了作者在解决ACM题目HihoCoder1138时的经验,通过排序方法确定图中各点在x轴和y轴上最近的点。博客内容包含具体的距离计算策略和程序代码实现,适用于对算法和图论感兴趣的读者。
题目来源:
   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方向上的距离最近的点,如下图:


通过寻找x前驱、x后继、y前驱、y后继,可以为每一个点找到4个距离最近的点。而对于起点s,它到终点e的最短路径一定会至少包含s的4个最近点中的1个。这个结论可以用反证法证明,如下:
    假设存在一条从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| 

如下图所示:

    

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值