“删除路径后的最短路问题”有感 | 豆包MarsCode AI刷题

40 阅读3分钟

问题如下:

image.png 我的思路如下:

代码解释

目的是解决一个最短路径问题,其中起点和终点之间的直接路径被删除了。我们需要使用Dijkstra算法来找到从起点到终点的最短路径,允许经过其他点,但不能直接通过删除的那条线。

1. 计算两点之间的欧几里得距离

我们首先定义了一个函数calculate_distance来计算两点之间的欧几里得距离。这个函数接受四个参数:两个点的x坐标和y坐标。它使用欧几里得距离公式来计算并返回距离。

2. 构建邻接矩阵

接下来,我们构建了一个邻接矩阵dist,其中dist[i][j]表示第i个点和第j个点之间的距离。如果两个点是同一个点,距离设置为0。

3. Dijkstra算法实现

我们定义了一个函数dijkstra来实现Dijkstra算法。这个函数接受三个参数:起点start,终点end,以及邻接矩阵dist

  • 如果起点等于终点,我们需要找到一个最小的环。我们通过计算从起点到每个中间点再返回起点的距离来实现这一点,并返回最小的环。
  • 如果起点不等于终点,我们初始化一个距离数组distances,将起点的距离设置为0,并将所有其他点的距离设置为无穷大。我们还初始化一个优先队列pq和一个访问标记集合visited
  • 我们从优先队列中弹出具有最小距离的点,并将其添加到访问标记集合中。如果这个点是终点,我们返回当前的距离。
  • 我们遍历所有相邻节点,跳过已访问的节点和不允许的直接路径。如果通过当前节点到达下一个节点的距离小于已记录的距离,我们更新距离并将其添加到优先队列中。

4. 计算最短路径并格式化结果

最后,我们调用dijkstra函数来计算从起点到终点的最短路径,并使用"{:.2f}".format(result)来格式化结果,保留两位小数。

心得

在解决这个问题时,我学到了以下几点:

  1. 理解问题:在开始编写代码之前,理解问题的要求和限制是非常重要的。这有助于我们设计出合适的算法和数据结构。
  2. 算法选择:Dijkstra算法是解决最短路径问题的常用算法。了解不同算法的适用场景和优缺点可以帮助我们选择合适的算法。
  3. 代码组织:将代码分解成函数和模块可以使代码更易于理解和维护。这也有助于我们重用代码和测试单个功能。
  4. 测试:编写测试用例来验证代码的正确性是非常重要的。这可以帮助我们发现并修复潜在的错误。

总结

这段代码使用Dijkstra算法解决了一个最短路径问题,其中起点和终点之间的直接路径被删除了。通过构建邻接矩阵并实现Dijkstra算法,我们可以找到从起点到终点的最短路径。我们还编写了测试用例来验证代码的正确性。通过这个过程,我学到了如何有效地解决问题,选择合适的算法,并组织代码。

###附代码

image.png

image.png