python 邻接表+堆优化(优先队列)实现dijkstra(迪杰斯特拉)单源最短路径算法.优化后

该文章介绍了一种解决从矩阵左上角到右下角的最短路径问题的方法,不使用DFS或BFS,而是通过将矩阵转化为图并应用Dijkstra算法。首先,它随机生成一个n*n的整数矩阵,然后将其转换为邻接表结构。接着,通过Dijkstra算法找出经过所有点的最短路径和最小总和。最后,文章给出了实现这些功能的Python代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 在一个n*n矩阵中,有每一个点都有一个值,小明从左上角走到右下角,求经过所有点的和最小的最短路径

思路:不采用dfs或bfs,将矩阵转换成图,使用dijskstra算法

import numpy as np
import heapq

n = int(input())  # 矩阵大小
temp = np.random.randint(0, 100, size=(n, n)) #随机生成范围在0~100的n*n的矩阵


def dijkstra(adj_list, start, end):
    # 初始化距离和前驱节点
    dist = {node: float('inf') for node in adj_list}
    dist[start] = 0
    prev = {node: None for node in adj_list}

    # 使用优先队列存储节点和距离信息
    pq = [(0, start)]
    while pq:
        # 取出队列中距离最小的节点
        curr_dist, curr_node = heapq.heappop(pq)
        if curr_node == end:
            # 回溯路径
            path = []
            node = end
            while node is not None:
                path.append(node)
                node = prev[node]
            path.reverse()
            return path, curr_dist

        # 遍历当前节点的所有邻居节点
        for neighbor, weight in adj_list[curr_node]:
            new_dist = curr_dist + weight
            if new_dist < dist[neighbor]:
                # 更新邻居节点的距离和前驱节点
                dist[neighbor] = new_dist
                prev[neighbor] = curr_node
                heapq.heappush(pq, (new_dist, neighbor))

    # 如果无法到达终点,返回空列表
    return []


# 将矩阵转换为带权值的邻接表
def matrix_to_adj_list(matrix):
    n, m = len(matrix), len(matrix[0])
    adj_list = {}
    for i in range(n):
        for j in range(m):
            node = (i, j)
            neighbors = []
            if i > 0:
                neighbors.append(((i - 1, j), matrix[i - 1][j]))
            if i < n - 1:
                neighbors.append(((i + 1, j), matrix[i + 1][j]))
            if j > 0:
                neighbors.append(((i, j - 1), matrix[i][j - 1]))
            if j < m - 1:
                neighbors.append(((i, j + 1), matrix[i][j + 1]))
            adj_list[node] = neighbors
    print(adj_list)
    return adj_list


# 使用Dijkstra算法求解左上角到右下角的最短路径
def shortest_path(matrix):
    adj_list = matrix_to_adj_list(matrix)
    start, end = (0, 0), (len(matrix) - 1, len(matrix[0]) - 1)
    return dijkstra(adj_list, start, end)


print(temp)
pathList, shortValue = shortest_path(temp)
print(pathList,"///",shortValue)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值