实现 Dijkstra 算法解决最短路径问题。

Dijkstra 算法是一种用于计算单源最短路径的经典算法,适用于加权有向图,其中边的权重为非负数。以下是 Dijkstra 算法的 Python 实现:

pythonCopy Codeimport heapqdef dijkstra(graph, start):    """
    计算从起点 start 到图中所有其他节点的最短路径。
    :param graph: 字典表示的图,格式为 {节点: [(邻居, 权重), ...]}
    :param start: 起点节点
    :return: 从起点到每个节点的最短路径长度字典,以及前驱节点字典
    """
    # 初始化最短路径字典,所有节点的初始距离为无穷大
    shortest_paths = {node: float('inf') for node in graph}
    shortest_paths[start] = 0  # 起点到自身的距离为 0
    # 前驱节点字典,用于重建路径
    predecessors = {node: None for node in graph}    # 优先队列,存储 (距离, 节点) 元组
    priority_queue = [(0, start)]    while priority_queue:
        current_distance, current_node = heapq.heappop(priority_queue)        # 如果弹出的距离大于已知的最短距离,则跳过
        if current_distance > shortest_paths[current_node]:            continue
        # 遍历当前节点的邻居
        for neighbor, weight in graph[current_node]:
            distance = current_distance + weight            # 如果找到更短的路径,则更新最短路径和前驱节点
            if distance < shortest_paths[neighbor]:
                shortest_paths[neighbor] = distance
                predecessors[neighbor] = current_node
                heapq.heappush(priority_queue, (distance, neighbor))    return shortest_paths, predecessorsdef reconstruct_path(predecessors, start, target):    """
    根据前驱节点字典重建从起点到目标节点的路径。
    :param predecessors: 前驱节点字典
    :param start: 起点节点
    :param target: 目标节点
    :return: 从起点到目标节点的路径列表,如果不存在路径则返回空列表
    """
    path = []
    current = target    while current is not None:
        path.append(current)
        current = predecessors[current]
    path.reverse()    # 如果路径以起点开始,则返回路径,否则返回空列表
    return path if path[0] == start else []# 示例图graph = {    'A': [('B', 1), ('C', 4)],    'B': [('A', 1), ('C', 2), ('D', 5)],    'C': [('A', 4), ('B', 2), ('D', 1)],    'D': [('B', 5), ('C', 1)]
}
start_node = 'A'shortest_paths, predecessors = dijkstra(graph, start_node)print("最短路径长度:", shortest_paths)
target_node = 'D'path = reconstruct_path(predecessors, start_node, target_node)print(f"从 {start_node} 到 {target_node} 的路径:", path)

代码说明:

  1. 图的表示‌:图使用一个字典表示,其中每个键是一个节点,值是一个列表,列表中的每个元素是一个元组,表示邻居节点和到该邻居的边的权重。

  2. 优先队列‌:使用  heapq 模块实现优先队列,以便始终扩展当前已知距离最短的节点。

  3. 最短路径计算‌:

    • 初始化所有节点的最短路径为无穷大,起点的最短路径为 0。
    • 使用优先队列存储待处理的节点,初始时只包含起点。
    • 每次从队列中取出距离最短的节点,更新其邻居的最短路径。
  4. 路径重建‌:通过前驱节点字典,从目标节点回溯到起点,重建最短路径。

这个实现可以有效地计算单源最短路径,并重建从起点到任意目标节点的路径。


http://travel.zgjzs.org

http://hotel.zgjzs.org

http://food.zgjzs.org

http://tech.zgjzs.org

http://health.zgjzs.org

http://edu.zgjzs.org

http://music.zgjzs.org

http://sports.zgjzs.org

http://fashion.zgjzs.org

http://auto.zgjzs.org

http://finance.zgjzs.org

http://law.zgjzs.org

http://art.zgjzs.org

http://book.zgjzs.org

http://movie.zgjzs.org

http://game.zgjzs.org

http://job.zgjzs.org

http://house.zgjzs.org

http://kids.zgjzs.org

http://pet.zgjzs.org

http://beauty.zgjzs.org

http://garden.zgjzs.org

http://science.zgjzs.org

http://history.zgjzs.org

http://culture.zgjzs.org

http://city.zgjzs.org

http://weather.zgjzs.org

http://map.zgjzs.org

http://data.zgjzs.org

http://energy.zgjzs.org

http://eco.zgjzs.org

http://farm.zgjzs.org

http://market.zgjzs.org

http://trade.zgjzs.org

http://service.zgjzs.org

http://club.zgjzs.org

http://event.zgjzs.org

http://festival.zgjzs.org

http://expo.zgjzs.org

http://museum.zgjzs.org

http://library.zgjzs.org

http://school.zgjzs.org

http://hospital.zgjzs.org

http://bank.zgjzs.org

http://insurance.zgjzs.org

http://stock.zgjzs.org

http://invest.zgjzs.org

http://tour.zgjzs.org

http://electronics.shangpin.org

http://clothing.shangpin.org

http://furniture.shangpin.org

http://jewelry.shangpin.org

http://cosmetic.shangpin.org

http://digital.shangpin.org

http://appliance.shangpin.org

http://outdoor.shangpin.org

http://sporting.shangpin.org

http://luxury.shangpin.org

http://grocery.shangpin.org

http://office.shangpin.org

http://tool.shangpin.org

http://craft.shangpin.org

http://antique.shangpin.org

http://collectible.shangpin.org

http://handmade.shangpin.org

http://organic.shangpin.org

http://baby.shangpin.org

http://watch.shangpin.org

http://bag.shangpin.org

http://shoe.shangpin.org

http://glass.shangpin.org

http://ceramic.shangpin.org

http://textile.shangpin.org

http://metal.shangpin.org

http://wood.shangpin.org

http://stone.shangpin.org

http://plastic.shangpin.org

http://paper.shangpin.org

http://ink.shangpin.org

http://paint.shangpin.org

http://lighting.shangpin.org

http://kitchen.shangpin.org

http://bath.shangpin.org

http://bed.shangpin.org

http://sofa.shangpin.org

http://carpet.shangpin.org

http://curtain.shangpin.org

http://lamp.shangpin.org

http://mirror.shangpin.org

http://clock.shangpin.org

http://vase.shangpin.org

http://frame.shangpin.org

http://toy.shangpin.org

http://instrument.shangpin.org

http://plant.shangpin.org

http://gift.shangpin.org

http://business.snjrw.org

http://media.snjrw.org

http://design.snjrw.org

http://photo.snjrw.org

http://video.snjrw.org

http://studio.snjrw.org

http://network.snjrw.org

http://cloud.snjrw.org

http://career.snjrw.org

http://learning.snjrw.org

http://research.snjrw.org

http://innovation.snjrw.org

http://project.snjrw.org

http://solution.snjrw.org

http://global.snjrw.org

http://local.snjrw.org

http://china.snjrw.org

http://asia.snjrw.org

http://europe.snjrw.org

http://america.snjrw.org

http://africa.snjrw.org

http://ocean.snjrw.org

http://space.snjrw.org

http://earth.snjrw.org

http://nature.snjrw.org

http://green.snjrw.org

http://future.snjrw.org

http://ai.snjrw.org

http://robot.snjrw.org

http://vr.snjrw.org

http://ar.snjrw.org

http://iot.snjrw.org

http://blockchain.snjrw.org

http://crypto.snjrw.org

http://nft.snjrw.org

http://metaverse.snjrw.org

http://smart.snjrw.org

http://safe.snjrw.org

http://privacy.snjrw.org

http://security.snjrw.org

http://trust.snjrw.org

http://quality.snjrw.org

http://certified.snjrw.org

http://premium.snjrw.org

http://elite.snjrw.org

http://vip.snjrw.org

http://prime.snjrw.org

http://gold.snjrw.org

请使用浏览器的分享功能分享到微信等