问题如下:
我的思路如下:
代码解释
目的是解决一个最短路径问题,其中起点和终点之间的直接路径被删除了。我们需要使用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)
来格式化结果,保留两位小数。
心得
在解决这个问题时,我学到了以下几点:
- 理解问题:在开始编写代码之前,理解问题的要求和限制是非常重要的。这有助于我们设计出合适的算法和数据结构。
- 算法选择:Dijkstra算法是解决最短路径问题的常用算法。了解不同算法的适用场景和优缺点可以帮助我们选择合适的算法。
- 代码组织:将代码分解成函数和模块可以使代码更易于理解和维护。这也有助于我们重用代码和测试单个功能。
- 测试:编写测试用例来验证代码的正确性是非常重要的。这可以帮助我们发现并修复潜在的错误。
总结
这段代码使用Dijkstra算法解决了一个最短路径问题,其中起点和终点之间的直接路径被删除了。通过构建邻接矩阵并实现Dijkstra算法,我们可以找到从起点到终点的最短路径。我们还编写了测试用例来验证代码的正确性。通过这个过程,我学到了如何有效地解决问题,选择合适的算法,并组织代码。
###附代码