python实现Dijkstra算法的最短路径问题

要使用Python实现Dijkstra算法,可以按照以下步骤:

1. 初始化图的节点和边

初始化图的节点和边,可以使用字典或列表。

以一个简单的图为例:

graph = {
    'A': {'B': 10, 'C': 3},
    'B': {'C': 1, 'D': 2},
    'C': {'B': 4, 'D': 8, 'E': 2},
    'D': {'E': 7},
    'E': {'D': 9}
}

2. 初始化起点和终点

以起点为例:

start = 'A'

3. 初始化节点的最短距离和前置节点

可以使用字典来表示每个节点的最短距离和前置节点。首先将起点的最短距离初始化为0,其他节点的最短距离初始化为无限大。

shortest_distance = {start: 0}
for node in graph:
    if node != start:
        shortest_distance[node] = float('inf')

前置节点初始化为None。

predecessor = {start: None}
for node in graph:
    if node != start:
        predecessor[node] = None

4. 实现Dijkstra算法

Dijkstra算法的核心步骤是遍历所有节点,更新每个节点的最短距离和前置节点。可使用堆优化的优先队列来提高效率。

以下是完整的Dijkstra算法Python代码:

import heapq

def dijkstra(graph, start):
    # 1. 初始化图的节点和边
    pq = [] # 堆优化的优先队列
    heapq.heappush(pq, (0, start)) # 将起点加入到优先队列中
    shortest_distance = {start: 0} # 起点到各个节点的最短距离
    predecessor = {start: None} # 节点的前置节点

    for node in graph:
        if node != start:
            shortest_distance[node] = float('inf') # 初始化,将起点到其他节点的最短距离都设为无限大
            predecessor[node] = None # 初始化,将其他节点的前置节点都设为None

    # 2. 实现Dijkstra算法
    while pq:
        (current_dis, current_node) = heapq.heappop(pq) # 取出当前距离最短的节点
        if current_dis > shortest_distance[current_node]: # 如果当前节点到起点的距离已经大于当前最短距离,则忽略该节点
            continue
        for neighbor, dis in graph[current_node].items(): # 遍历当前节点的邻居节点
            distance = current_dis + dis # 更新邻居节点到起点的距离
            if distance < shortest_distance[neighbor]: # 如果更新的距离比原先的距离短,则更新距离和前置节点,并将邻居节点加入到优先队列中
                shortest_distance[neighbor] = distance
                predecessor[neighbor] = current_node
                heapq.heappush(pq, (distance, neighbor))

    return shortest_distance, predecessor

5. 测试Dijkstra算法

使用上面初始化的图和起点测试Dijkstra算法:

shortest_distance, predecessor = dijkstra(graph, start)
print(shortest_distance) # 输出起点到各个节点的最短距离
print(predecessor) # 输出每个节点的前置节点

得到以下输出:

{
    'A': 0,
    'B': 7,
    'C': 3,
    'D': 9,
    'E': 5
}
{
    'A': None,
    'B': 'C',
    'C': 'A',
    'D': 'B',
    'E': 'C'
}

这表明,起点到节点A的距离为0,到节点B的距离为7,到节点C的距离为3,到节点D的距离为9,到节点E的距离为5;每个节点的前置节点也已经正确计算出来。

再以另一个图为例:

graph = {
    'A': {'B': 10, 'D': 6},
    'B': {'A': 10, 'C': 4, 'D': 2},
    'C': {'B': 4, 'D': 3},
    'D': {'A': 6, 'B': 2, 'C': 3}
}
start = 'A'
shortest_distance, predecessor = dijkstra(graph, start)
print(shortest_distance)
print(predecessor)

输出如下:

{
    'A': 0,
    'B': 8,
    'C': 9,
    'D': 6
}
{
    'A': None,
    'B': 'D',
    'C': 'B',
    'D': 'A'
}

这表明,起点到节点A的距离为0,到节点B的距离为8,到节点C的距离为9,到节点D的距离为6;每个节点的前置节点也已经正确计算出来。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python实现Dijkstra算法的最短路径问题 - Python技术站

(0)
上一篇 2023年5月14日
下一篇 2023年5月14日

相关文章

  • Python中字典与恒等运算符的用法分析

    Python中字典与恒等运算符的用法分析 什么是字典 字典是Python中内置的一种数据类型,也称为“关联数组”或“映射”。字典是由一系列键(key)和对应值(value)组成的无序集合,键和值之间通过“冒号”进行配对,并用“花括号”括起来。 字典的特点: 字典中的键必须唯一且不可变(可以是字符串、数字、元组等,但不能是列表) 键值对可以按任意顺序排列 可以…

    python 2023年5月13日
    00
  • python爬虫入门教程–利用requests构建知乎API(三)

    “python爬虫入门教程–利用requests构建知乎API(三)”是一篇关于使用Python爬虫抓取知乎网站数据的教程,主要讲解如何通过Python编写代码,使用requests库模拟浏览器发起HTTP请求,然后抓取知乎网站的信息内容并进行解析。 该教程主要分为以下几个部分: 介绍了基本的requests库使用方式,包括向URL发送GET或POST请求…

    python 2023年5月14日
    00
  • python获取文件真实链接的方法,针对于302返回码

    Python 获取文件真实链接的方法,针对于 302 返回码 在爬取网站数据时,有些网站会将文件链接进行加密或者重定向,为了获取文件的真实链接,我们需要对重定向进行处理。以下是 Python 获取文件真实链接的方法,针对于 302 返回码。 使用 requests 模块获取真实链接 使用 requests 模块获取真实链接非常简单,只需要使用 allow_r…

    python 2023年5月15日
    00
  • 详解Python中多线程和多处理的区别

    区别一:多线程和多进程的基本概念多线程,意味着程序同时运行多个线程。线程在同一个进程中,共享相同的内存空间。多线程通常用于I/O密集型任务,如对大量数据进行读写或网络请求。Python通过内置的threading模块支持多线程。 多进程,意味着程序同时运行多个进程。每个进程都有自己的内存空间和系统资源,互相之间独立运行。多进程通常用于CPU密集型任务,如计算…

    python-answer 2023年3月25日
    00
  • Python走楼梯问题解决方法示例

    下面我将为您详细讲解“Python走楼梯问题解决方法示例”的完整攻略。这个问题也称作“爬楼梯问题”,是一个经典的动态规划问题。 问题描述 这个问题是这样的,在一个楼梯中,你要么走一步,要么走两步,问你走到第n个台阶共有多少种方法。 分析思路 我们可以通过举几个例子来分析问题: 当n=1时,只有一种方法; 当n=2时,有两种方法; 当n=3时,可以从第一级台阶…

    python 2023年6月6日
    00
  • 是否可以使用字典理解在 python 中反转字典

    【问题标题】:is it possible to reverse a dictionary in python using dictionary comprehension是否可以使用字典理解在 python 中反转字典 【发布时间】:2023-04-06 02:26:01 【问题描述】: 我想使用字典推导来反转字典 key, value 对,但如果新字典有…

    Python开发 2023年4月6日
    00
  • 详解Python 函数参数的拆解

    下面我将为你详细讲解“详解Python函数参数的拆解”的完整攻略。 一、函数参数解包 Python中,函数的参数传递方式支持两种:位置/关键字参数和可变参数列表。同时,Python也支持将一个序列或映射对象解包为不同的参数调用函数。这被称为“参数拆解”。 1.1 位置参数拆解 位置参数拆解的语法非常简单,即用 * 运算符对元组或列表进行拆解。这样可以将元组或…

    python 2023年5月14日
    00
  • Python入门教程(四十)Python的NumPy数组创建

    下面是Python入门教程(四十)Python的NumPy数组创建的完整攻略。 什么是NumPy数组 NumPy是用Python语言实现的科学计算包,它是Python科学计算的基础包之一,具有高效的多维数组处理能力。在数据分析、科学计算、机器学习、深度学习等领域中,NumPy已成为标配。 NumPy的核心是数组对象ndarray,也就是N-dimension…

    python 2023年5月14日
    00
合作推广
合作推广
分享本页
返回顶部