正在


私信TA

用户名:dotcpp0778882

访问量:324

签 名:

等  级
排  名 9094
经  验 1158
参赛次数 0
文章发表 30
年  龄 18
在职情况 学生
学  校 中央民族大学
专  业 计算机科学与技术

  自我简介:

解题思路:

为了解决这个问题,我们需要构建一个图,其中节点是点,边是两点之间的连线,边的权重是两点之间的直线距离。由于我们需要找到从源点到目标点的最短路径,我们可以使用Dijkstra算法(适用于有权图且边权重非负的情况)或Bellman-Ford算法(适用于可能包含负权边的图,但在这个问题中我们不需要)。由于题目明确说明边权重是非负的(直线距离),我们可以选择Dijkstra算法。
注意事项:

上述代码假设输入是通过标准输入读取的,并且为了简化处理,它直接在main函数中解析了所有输入。在实际应用中,你可能需要从文件或其他来源读取输入。

此外,这个实现假设图是连通的,或者至少从源点到目标点存在路径。如果图不是连通的,且源点和目标点不在同一个连通分量中,那么算法将返回无穷大(在这个实现中,它实际上是返回了源点到目标点的初始距离值,即float('inf'))。在实际应用中,你可能需要添加一些额外的逻辑来处理这种情况。



参考代码:

import heapq  

import math  

  

def dijkstra(n, edges, start):  

    # 初始化距离表,所有点距离初始化为无穷大,除了起点为0  

    distances = [float('inf')] * (n + 1)  

    distances[start] = 0  

      

    # 优先队列,用于存储待处理的节点和它们当前的距离  

    pq = [(0, start)]  

      

    while pq:  

        # 弹出当前距离最小的节点  

        current_distance, current_node = heapq.heappop(pq)  

          

        # 如果这个节点的距离已经被更短的距离替代,则跳过  

        if current_distance > distances[current_node]:  

            continue  

          

        # 遍历当前节点的所有邻居  

        for neighbor, weight in edges[current_node].items():  

            distance = current_distance + weight  

              

            # 如果找到了更短的路径,则更新距离,并将节点加入优先队列  

            if distance < distances[neighbor]:  

                distances[neighbor] = distance  

                heapq.heappush(pq, (distance, neighbor))  

      

    return distances  

  

def main():  

    import sys  

    input = sys.stdin.read  

    data = input().split()  

      

    # 解析输入  

    n = int(data[0])  

    points = [(int(data[i*2+1]), int(data[i*2+2])) for i in range(n)]  

    m = int(data[n*2+1])  

    edges = {i: {} for i in range(1, n+1)}  

      

    # 构建边和权重  

    for _ in range(m):  

        i, j = int(data[n*2+2+2*_]), int(data[n*2+2+2*_+1])  

        x1, y1 = points[i-1]  

        x2, y2 = points[j-1]  

        distance = math.sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2)  

        edges[i][j] = distance  

        edges[j][i] = distance  # 如果是无向图,则添加反向边  

      

    s, t = int(data[-2]), int(data[-1])  

      

    # 执行Dijkstra算法  

    distances = dijkstra(n, edges, s)  

      

    # 输出结果  

    print(f"{distances[t]:.2f}")  

  

if __name__ == "__main__":  

    main()


 

0.0分

0 人评分

  评论区

  • «
  • »