python矩阵/字典实现最短路径算法

yizhihongxing

Python中实现最短路径算法可以使用矩阵和字典两种方式,下面将逐一详细讲解这两种实现方式。

使用矩阵实现最短路径算法

简介

矩阵是将图中各个节点之间的距离存储下来的方式,通常使用二维数组来实现。我们将从以下几个方面来讲解使用矩阵实现最短路径算法:

  1. 如何初始化一个矩阵;
  2. 如何使用矩阵实现Dijkstra算法;
  3. 如何输出最短路径。

1. 初始化矩阵

假设我们有一张如下所示的有向带权图,图中共有5个节点(A、B、C、D、E),每个节点之间都有相应的距离:

     5      -3
(0)--->(1)<----(2)
 |         \     |
 |          \   -2
10           \  |
 |            V V
 V            (3)
(4)---------->(5)
     1

我们可以使用一个二维数组,来将节点之间的距离存储下来(使用inf表示不可达):

INF = float("inf")
graph = [
    [0, 5, INF, 10, INF, INF],
    [INF, 0, 3, INF, INF, INF],
    [INF, INF, 0, -2, INF, INF],
    [INF, INF, INF, 0, 6, INF],
    [INF, INF, INF, INF, 0, 1],
    [INF, INF, INF, INF, INF, 0]
]

2. 使用矩阵实现Dijkstra算法

Dijkstra算法是一个经典的图论算法,可以用来求解单源最短路径。使用矩阵实现Dijkstra算法,需要用到以下数据结构:

  • 距离列表dist:存储每个节点到起点的最短距离;
  • 判断列表sptSet:用于判断节点是否已被遍历;
  • 节点数量V:存储节点个数。

下面是使用矩阵实现Dijkstra算法的Python代码:

def dijkstra(graph, src):
    V = len(graph)
    dist = [INF] * V
    sptSet = [False] * V
    dist[src] = 0
    for _ in range(V):
        u = minDistance(dist, sptSet)
        sptSet[u] = True
        for v in range(V):
            if graph[u][v] and not sptSet[v] and dist[u] != INF and dist[u] + graph[u][v] < dist[v]:
                dist[v] = dist[u] + graph[u][v]
    return dist

def minDistance(dist, sptSet):
    min_dist = INF
    min_index = -1
    for v in range(len(dist)):
        if not sptSet[v] and dist[v] < min_dist:
            min_dist = dist[v]
            min_index = v
    return min_index

3. 输出最短路径

在Dijkstra算法完成之后,我们可以使用以下代码来输出起点到其他节点的最短路径:

for node in range(V):
    print(f"最短路径({src} -> {node}): {dijkstra(graph, src)[node]}")

其中,graph是存储节点距离的矩阵,src是起点节点的编号,node是需要输出最短路径的节点编号。

使用字典实现最短路径算法

简介

与矩阵相比,字典可以更加灵活的存储图结构,适用于处理不规则的图形结构。我们将从以下几个方面来讲解使用字典实现最短路径算法:

  1. 如何初始化一个字典;
  2. 如何使用字典实现Dijkstra算法。

1. 初始化字典

使用字典实现最短路径算法,我们需要使用两个字典来存储节点与其邻居节点及其对应的距离,一个字典用于存储起点到其他节点的最短路径。以下是一个示例字典:

graph = {
  "A": {"B": 5, "D": 10},
  "B": {"C": 3},
  "C": {"D": -2, "F": 1},
  "D": {"C": 6, "E": -3},
  "E": {"F": 1},
  "F": {}
}

start = "A"

2. 使用字典实现Dijkstra算法

与使用矩阵实现Dijkstra算法相比,使用字典实现Dijkstra算法需要对数据结构做出一些调整。下面是使用字典实现Dijkstra算法的Python代码:

def dijkstra(graph, start):
    shortest_paths = {start: 0}
    current_node = start
    visited = set()
    while current_node is not None:
        visited.add(current_node)
        destinations, weight = graph[current_node].items()
        for next_node, distance in destinations.items():
            if next_node in visited:
                continue
            new_distance = shortest_paths[current_node] + distance
            if next_node not in shortest_paths or new_distance < shortest_paths[next_node]:
                shortest_paths[next_node] = new_distance
        current_node = None
        for node in graph:
            if node not in visited and node in shortest_paths:
                if current_node is None or shortest_paths[node] < shortest_paths[current_node]:
                    current_node = node
    return shortest_paths

在上面的代码中,我们首先从起点开始,维护一个包含起点的最短路径字典shortest_paths。之后,遍历起点的邻居节点,更新字典中关于这些邻居节点的最短距离。接着,在未被遍历的节点中选择距离最短的一个节点,更新当前节点,直到所有的节点都被遍历。

以上是使用矩阵和字典两种方法实现最短路径算法的详细攻略。明白了吗?

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

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

相关文章

  • Python代码注释规范代码实例解析

    Python代码注释规范是编写高质量Python代码的重要组成部分。以下是Python代码注释规范的一些实例解析: 1. 单行注释 单行注释用于在一行代码后面添加注释,以解释代码的作用或提供其他相关信息。单行注释以#符号开头,直到行末结束。 以下是一个示例,演示如何使用单行注释: # This is a single line comment print(‘…

    python 2023年5月15日
    00
  • Python中time模块和datetime模块的用法示例

    一、time模块示例 time模块是Python标准库中的一个模块,提供了一些方便对时间进行处理的函数和类。下面通过两个示例,具体演示time模块的用法。 1.1 获取当前时间戳 获取当前时间戳,即从1970年1月1号到现在经过的秒数,可使用time模块的time()函数。代码如下: import time timestamp = time.time() p…

    python 2023年5月18日
    00
  • python用pip install时安装失败的一系列问题及解决方法

    Python用pip install时安装失败的一系列问题及解决方法 在Python编程中,我们经常会使用pip install命令来安装第三方库或模块。但是,有时候我们会遇到pip install安装失败的问题。本文将详细讲解Python用pip install时安装失败的一系列问题及解决方法,包括问题的原因、解决方法和两个示例。 问题原因 在Python…

    python 2023年5月13日
    00
  • selenium+python自动化78-autoit参数化与批量上传功能的实现

    Selenium+Python自动化78-AutoIt参数化与批量上传功能的实现 在使用Selenium进行自动化测试时,我们经常会遇到上传文件的场景。然而,使用Selenium自带的上传文件的方式,需要耗费大量的时间,因此我们可以使用AutoIt工具结合Selenium进行自动化测试来实现上传文件的功能。AutoIt是一种存在于Windows操作系统下的免…

    python 2023年5月19日
    00
  • python 实现语音聊天机器人的示例代码

    当今,人工智能技术得到了飞速的发展,语音聊天机器人也越来越受到欢迎。本篇文章将介绍使用Python语言实现语音聊天机器人的示例代码。具体的操作步骤如下: 安装依赖 在开始之前,需要安装三个库:SpeechRecognition、pyaudio和pyttsx3。可以通过在命令行窗口中运行以下命令来完成: pip install SpeechRecognitio…

    python 2023年5月30日
    00
  • 正则表达式(简单易懂篇)

    正则表达式是一种用于匹配字符串的模式,它可以用来检查字符串是否符合某种模式,或者从字符串中提取出符合某种模式的子串。在 Python 中,我们可以使用 re 模块来实现正则表达式的匹配。下面将详细讲解正则表达式的基本语法和用法。 1. 正则表达式的基本语法 正则表达式由普通字符和特殊字符组成。普通字符表示它本身,而特殊字符则表示一些特殊的含义。下面是一些常用…

    python 2023年5月14日
    00
  • 将python包发布到PyPI和制作whl文件方式

    将Python包发布到PyPI和制作.whl文件是开发Python程序时常见的任务之一,这些工作可以帮助开发者将自己的代码分享给其他开发者并让其它人能够轻松地安装并使用自己的代码。以下是完整攻略: 1.创建Python包 在开始发布python包之前,首先要创建自己的Python包。通常,一个Python包包含一个或多个Python模块、任何必需的资源文件和…

    python 2023年6月5日
    00
  • Python实现Word表格转成Excel表格的示例代码

    下面我会详细讲解Python实现Word表格转成Excel表格的完整实例教程。其中,我们将使用Python的第三方库python-docx和openpyxl来实现。 一、前期准备 在开始转换Word表格之前,我们需要安装以下两个Python库: python-docx:用于读取Word文档中的表格; openpyxl:用于将表格数据写入Excel。 你可以在…

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