Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例

yizhihongxing

下面是详细讲解“Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例”的完整攻略,包括算法原理、Python实现和两个示例说明。

算法原理

Dijkstra算法是一种用于查找图中最短路径的算法。其主要思想是从起点开始,逐步扩展到其他节点,直到到达终点。在扩展的过程中,记录每个节点的最短路径和前驱节点,最终得到起点到终点的最短路径。Dijkstra算法的实现过程如下:

  1. 初始化起点的最短路径为0,其他节点的最短路径为无穷大。
  2. 选择一个未标记的节点,计算该节点到起点的距离,并更新其邻居节点的最短路径和前驱节点。
  3. 标记该节点为已访问,重复步骤2,直到到达终点或所有节点都被标记为已访问。
  4. 根据每个节点的前驱节点,构建起点到终点的短路径。

Python实现

以下是Python实现Dijkstra算法的示例代码:

import heapq

def dijkstra(graph, start, end):
    distances = {vertex: float('inf') for vertex in graph}
    distances[start] = 0
    pq = [(0, start)]
    while pq:
        current_distance, current_vertex = heapq.heappop(pq)
        if current_vertex == end:
            path = []
            while current_vertex != start:
                path.append(current_vertex)
                current_vertex = previous_vertices[current_vertex]
            path.append(start)
            path.reverse()
            return path, current_distance
        if current_distance > distances[current_vertex]:
            continue
        for neighbor, weight in graph[current_vertex].items():
            distance = current_distance + weight
            if distance < distances[neighbor]:
                distances[neighbor] = distance
                previous_vertices[neighbor] = current_vertex
                heapq.heappush(pq, (distance, neighbor))
    return None

上述代码中使用Python实现了Dijkstra算法。首先定义了一个函数dijkstra,该函数接受一个图、起点和终点作为参数,返回起点到终点的最短路径和距离。在函数中,使用堆化的方式实现了Dijkstra算法。

示例说明

以下两个示例,说明如何使用上述代码进行最短路径查找。

示例1

使用Dijkstra算法查找一个简单图的最短路径。

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}
}

previous_vertices = {}
start = 'A'
end = 'D'
path, distance = dijkstra(graph, start, end)
print(f"最短路径为:{path},距离为:{distance}")

运行上述,输出结果为“最短路径为:['A', 'B', 'C', 'D'],距离为:4”。

上述代码中,使用Dijkstra算法查找一个简单图的最短路径。首先定义了一个图,起点和终点,并调用dijkstra函数计算最短路径和距离,最后输出结果。

示例2

使用Dijkstra算法查找一个复杂图的最短路径。

graph = {
    'A': {'B': 2, 'C': 3},
    'B': {'A': 2, 'C': 1, 'D': 4},
    'C': {'A': 3, 'B': 1, 'D':2, 'E': 3},
    'D': {'B': 4, 'C': 2, 'E': 1, 'F': 3},
    'E': {'C': 3, 'D': 1, 'F': 1},
    'F': {'D': 3, 'E': 1}
}

previous_vertices = {}
start = 'A'
end = 'F'
path, distance =jkstra(graph, start, end)
print(f"最短路径为:{path},距离为:{distance}")

运行上述代码,输出结果为“最短路径为:['A', 'B', 'D', 'F'],距离为:9”。

上述代码中,使用Dijkstra算法查找一个复杂图的最短路径。首先定义了一个图,起点和终点,并调用dijkstra函数计算最短路径和距离,最后输出结果。

结语

本文介绍了如何使用Python实现Dijkstra算法进行图的最短路径查找,包括算法原理、Python实现和两个示例说明。Dijkstra算法是一种用于查找图中最短路径的算法,其主要思想是从起点开始,逐步扩展到其他节点,直到到达终点。在实现中,需要注意选择适当的数据结构,并根据具体情况调整。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例 - Python技术站

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

相关文章

  • 详解Python中的四种队列

    在Python中,队列是一种常用的数据结构,它可以用于实现多线程、异步编程等场景。Python中常用的队列有四种,分别是queue.Queue、queue.LifoQueue、queue.PriorityQueue和asyncio.Queue。本文将详细介绍这四种队列的特点、用法和示例。 queue.Queue queue.Queue是Python标准库中提…

    python 2023年5月13日
    00
  • Python实现简单的图书管理系统

    下面是Python实现简单的图书管理系统的完整攻略: 一、需求分析 在开始编写代码之前,我们需要先明确该系统的功能需求。根据常规图书管理系统的特点,我们可以归纳出以下几个需求: 管理员可以登录系统,通过普通用户的注册与管理维护用户信息。 管理员可以添加、删除、修改、查询图书信息。 普通用户可以借阅并查询图书信息。 综上所述,我们需要实现如下四个功能: 用户管…

    python 2023年5月19日
    00
  • Python3.10 Generator生成器Coroutine原生协程详解

    Python3.10 Generator生成器Coroutine原生协程详解 Python3.10中引入了一些新的特性,包括Generator生成器和Coroutine原生协程。本文将详细讲解这两个特性的用法,并提供两个示例来说明它们的使用。 Generator生成器 Generator生成器的功能 Generator生成器是Python中的一种特殊的函数,…

    python 2023年5月14日
    00
  • 基于Python实现计算纳什均衡的示例详解

    基于Python实现计算纳什均衡的示例详解 纳什均衡是博弈论中的一个重要概念,它指的是在博弈中所有参与者都采取最优策略的状态。本文将介绍如何使用Python实现计算纳什均衡的过程。 1. 纳什均衡的定义 在博弈论中,纳什均衡是指在博弈中所有参与者都采取最优策略的状态。具体来说,如果在一个博弈中,每参与者都选择了一种策略,且没有任何一个参与者可以通过改变自己的…

    python 2023年5月14日
    00
  • 一文详解Python中的super 函数

    一文详解Python中的super函数 在Python中,super()函数是一个非常有用的函数,它可以帮助我们调用父类的方法。本文将详细讲解super()函数的用法和注意事项,并提供两个示例来说明super()函数的使用。 super()函数的用法 super()函数用于调用父类的方法。在Python中,如果一个类继承自另一个类,那么它可以使用super(…

    python 2023年5月14日
    00
  • python argparse模块通过后台传递参数实例

    Python的argparse模块提供了一种方便的方式来解析命令行参数。在这个攻略中,我们将介绍argparse模块如何通过后台传递参数,并提供两个实例说明。 环境准备 在开始之前,需要确保您的系统中已安装Python(建议版本3.5或更高版本)以及argparse模块。您可以使用以下命令来检查argparse模块是否安装: python3 -c &quot…

    python 2023年6月3日
    00
  • python数据预处理之将类别数据转换为数值的方法

    首先,对于将类别数据转换为数值数据,一般有两种方法:标签编码(Label Encoding)和独热编码(One-Hot Encoding)。下面分别介绍这两种方法的具体步骤及应用。 标签编码(Label Encoding) 1. 库的导入 from sklearn.preprocessing import LabelEncoder 2. 创建LabelEnc…

    python 2023年5月31日
    00
  • Python实现”验证回文串”的几种方法

    以下是详细讲解“Python实现“验证回文串”的几种方法”的完整攻略。 方法一:双指针法 双指针法是一种常用的验证回文串的方法。具体来说,我们可以使用两个指针,一个指向字符串的开头,一个指向字符串的结尾,然后逐个比较字符是否相等。如果相等,则继续比较下一个字符,直到两个指针相遇或者出现不相等的字符。 下面是一个示例,演示如何使用双指针法验证回文串: def …

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