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

yizhihongxing

要使用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 Redis 库的 Pub/Sub 功能?

    如何使用 Python Redis库的Pub/Sub功能? Redis是一种高性能的键值存储数据库,支持多种数据结构和功能。其中,Pub/Sub功能是Redis的一个重要特性,可以用于实现消息传递和事件通知等功能。在本文中,我们将介绍如何使用Python Redis库的Pub/Sub功能的完整使用攻略,包括创建发布者和订阅者、发布和订阅消息等操作。 步骤1:…

    python 2023年5月12日
    00
  • 基于OpenCV和Gradio实现简单的人脸识别详解

    首先让我们来详细讲解“基于OpenCV和Gradio实现简单的人脸识别详解”的完整攻略。 简介 本攻略将介绍如何使用OpenCV和Gradio实现简单的人脸识别。通过本攻略,您可以学习到以下知识点: 如何使用OpenCV读取图像文件并识别人脸 如何使用Gradio搭建简单的Web应用来进行人脸识别 环境准备 在开始之前,您需要先安装以下软件: Python3…

    python 2023年5月19日
    00
  • 分享11个Python自动化操作Excel的方法

    分享11个Python自动化操作Excel的方法 本次攻略将会介绍11个可以用Python进行Excel自动化操作的方法,这将会对需要频繁操作Excel的企业,以及需要进行Excel数据处理的数据分析人员有所帮助。 示例1:写入Excel数据 import openpyxl wb = openpyxl.Workbook() # 新建一个excel ws = …

    python 2023年5月19日
    00
  • 如何在python中使用selenium的示例

    如何在Python中使用Selenium Selenium是一个自动化测试工具,可以模拟用户在浏览器中的操作,例如点击、输入、提交等。在Python中,我们可以使用Selenium来实现自动化测试、爬虫等任务。本攻略将介绍如何在Python中使用Selenium。 安装Selenium 在使用Selenium之前,我们需要先安装Selenium库。可以使用p…

    python 2023年5月15日
    00
  • Python OpenCV高斯金字塔与拉普拉斯金字塔的实现

    Python OpenCV高斯金字塔与拉普拉斯金字塔的实现 前言 本文将介绍 Python OpenCV 中高斯金字塔和拉普拉斯金字塔的实现方法。高斯金字塔和拉普拉斯金字塔是图像处理中的经典算法,通常用于缩放、图像增强以及细节增强等应用场合。本文将从原理、代码实现等方面进行介绍。 高斯金字塔 高斯金字塔是一类离散均值滤波的变换,通常用于图像缩放等应用场合。高…

    python 2023年5月18日
    00
  • python实现学生信息管理系统

    Python实现学生信息管理系统 简介 学生信息管理系统可以统计、查询、修改、删除学生信息,为学校管理提供便利。本文将介绍如何使用Python实现学生信息管理系统。 功能 添加学生信息 查询学生信息 修改学生信息 删除学生信息 环境搭建 安装Python3 安装pymysql pip install pymysql 数据库设计 学生信息表:student 字…

    python 2023年5月19日
    00
  • 基于pycharm的beautifulsoup4库使用方法教程

    基于PyCharm的BeautifulSoup4库使用方法教程 在本教程中,我们将介绍如何在PyCharm中使用BeautifulSoup4库来解析HTML和XML文档。我们将提供两个示例,演示如何获取HTML文档中的标题和链接。 安装BeautifulSoup4库 在使用BeautifulSoup4库之前,我们需要先安装它。可以使用pip命令来安装Beau…

    python 2023年5月15日
    00
  • python爬取网页内容转换为PDF文件

    在本攻略中,我们将介绍如何使用Python爬取网页内容并将其转换为PDF文件。我们将使用requests库、BeautifulSoup库和pdfkit库来实现这个功能。 以下是完整攻略包括两个示例。 步骤1:安装必要的库 在开始之前,我们需要安装必要的库。我们可以使用以下命令来安装这些库: pip install requests beautifulsoup…

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