第2关:复杂山路物资运送:配置地图

#coding=utf-8
#输出路径结果
wayList = []

#在该方法中完成寻路算法,并将包含起点和终点在内的路径序号(int类型)按照顺序放入wayList数组中
# nodeCount:抽象图中的节点总数量
# costs:二维权值数组,表示序号0~nodeCount节点之间的权值关系,元素为int类型,比如使用data.costs[0][2]获得第一个节点和第三个节点之间的权值
# startIndex:起始节点序号
# endIndex:终点节点序号
def FindPath(nodeCount, costs, startIndex, endIndex):
    ###### Begin ######
    def dijkstra(graph, start, end):
        # 初始化距离列表,用于记录起点到各个节点的距离
        distance = [float('inf')] * nodeCount
        distance[start] = 0  # 起点到起点的距离为0
        # 初始化已访问节点列表,用于记录已经确定最短路径的节点
        visited = [False] * nodeCount
        # 初始化路径列表,用于记录路径
        path = [[] for _ in range(nodeCount)]

        # 找到起点到终点的最短路径
        for _ in range(nodeCount):
            # 找到未访问节点中距离最短的节点
            min_distance = float('inf')
            min_index = -1
            for i in range(nodeCount):
                if not visited[i] and distance[i] < min_distance:
                    min_distance = distance[i]
                    min_index = i
            if min_index == -1:
                break  # 如果不存在未访问的节点,则跳出循环
            visited[min_index] = True  # 将最短路径节点标记为已访问
            # 更新起点到各个节点的距离和路径
            for i in range(nodeCount):
                if not visited[i] and graph[min_index][i] > 0:
                    new_distance = distance[min_index] + graph[min_index][i]
                    if new_distance < distance[i]:
                        distance[i] = new_distance
                        path[i] = path[min_index] + [min_index]
        return path[end] + [end]  # 返回起点到终点的最短路径

    # 构建邻接矩阵,用于表示节点之间的距离
    graph = [[0] * nodeCount for _ in range(nodeCount)]
    for i in range(nodeCount):
        for j in range(nodeCount):
            graph[i][j] = costs[i][j] if i != j else 0

    # 使用 Dijkstra 算法求解最短路径
    wayList.extend(dijkstra(graph, startIndex, endIndex))
    ###### end ######
    return wayList

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YLTommi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值