文章目录

  • dijkstra算法
    • 一、 简介
      • 1、 概念
    • 二、 实现原理
      • 1、 动图演示
      • 2、 思路解析
    • 三、 代码实现
      • 1、 构建矩阵
      • 2、 算法实现

dijkstra算法

一、 简介

1、 概念

Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。注意该算法要求图中不存在负权边。

问题描述:在无向图 G=(V,E) 中,假设每条边 E[i] 的长度为 w[i],找到由顶点 V0 到其余各点的最短路径。(单源最短路径)

二、 实现原理

1、 动图演示

2、 思路解析

S集合 U集合
选A为起点,S={A}
此时的最短路径
A->A=0
以A为中心点,从A开始查找
U={B, C, D, E, F}
A->B=10
A->D=4
A->{E, F, C}=∞\infty∞
d(AD)最短
选入D,此时S={A, D}
此时最短路径
A->A=0
A->D=4
以D为中间点,从A->D这条最短路径进行查找
U={B, C, E, F}
A->D->B=6 < 10
A->D->E=10
A->D->C=19
A->D->F=∞\infty∞
d(ADB)最短
选入B,此时S={A, D, B}
此时最短路径
A->A=0
A->D=4
A->D->B=6
以B为中间点,从A->D->B这条路径进行查找
U={C, E, F}
A->D->B->C=14<19
A->D->B->E=12>10
A->D->B->F=∞\infty∞
d(ADE)最短
选入E,此时S={A, D, B, E}
此时最短路径
A->A=0
A->D=4
A->D->B=6
A->D->E=10
以E为中间点,从A->D->E这条路径进行查找
U={C, F}
A->D->E->C=11<14
A->D->E->F=22
d(ADEC)最短
选入C,此时S={A, D, B, E, C}
此时最短路径
A->A=0
A->D=4
A->D->B=6
A->D->E=10
A->D->E->C=11
以C为中间点,从A->D->E->C这条路径进行查找
U={F}
A->D->E->C->F=16
发现最短路径为A->D->E->C->F
选入F,此时S={A, D, B, E, C, F}
此时最短路径
A->A=0
A->D=4
A->D->B=6
A->D->E=10
A->D->E->C=11
A->D->E->C->F=16
以F为中间点,从A->D->E->C->F这条路径进行查找
集合为空,查找完毕

最后,我们得出

路径 距离
A->A 0
A->D 4
A->D->B 6
A->D->E 10
A->D->E->C 11
A->D->E->C->F 16

三、 代码实现

1、 构建矩阵

我们使得与节点有直接接触的节点的距离为确定值,没有直接接触的节点为无穷大,然后构建一个二维矩阵

A B C D E F
A 0 10 ∞\infty∞ 4 ∞\infty∞ ∞\infty∞
B 10 0 8 2 6 ∞\infty∞
C ∞\infty∞ 8 0 15 1 5
D 4 2 15 0 6 ∞\infty∞
E ∞\infty∞ 6 1 6 0 12
F ∞\infty∞ ∞\infty∞ 5 ∞\infty∞ 12 0

2、 算法实现

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
__author__ = "A.L.Kun"
__file__ = "demo02.py"
__email__ = "liu.zhong.kun@foxmail.com"
MAX = float('inf')def dijkstra(matrix, start_node):matrix_length = len(matrix)  # 矩阵一维数组的长度,即节点的个数used_node = [False] * matrix_length  # 访问过的节点数组distance = [MAX] * matrix_length  # 最短路径距离数组distance[start_node] = 0  # 初始化,将起始节点的最短路径修改成0# 将访问节点中未访问的个数作为循环值,其实也可以用个点长度代替。while used_node.count(False):min_value = MAXmin_value_index = -1# 在最短路径节点中找到最小值,已经访问过的不在参与循环。# 得到最小值下标,每循环一次肯定有一个最小值for index in range(matrix_length):if not used_node[index] and distance[index] < min_value:min_value = distance[index]min_value_index = index# 将访问节点数组对应的值修改成True,标志其已经访问过了used_node[min_value_index] = True# 更新distance数组。# 以B点为例:distance[x] 起始点达到B点的距离。# distance[min_value_index] + matrix[min_value_index][index] 是起始点经过某点达到B点的距离,比较两个值,取较小的那个。for index in range(matrix_length):distance[index] = min(distance[index], distance[min_value_index] + matrix[min_value_index][index])return distancematrix_ = [[0,10,MAX,4,MAX,MAX],[10,0,8,2,6,MAX],[MAX,8,10,15,1,5],[4,2,15,0,6,MAX],[MAX,6,1,6,0,12],[MAX,MAX,5,MAX,12,0]
]
ret = dijkstra(matrix_, 0)
print(ret)

Python实现dijkstra算法相关推荐

  1. 基于C++和Python的Dijkstra算法实现及其堆优化

    最短路径问题:任给一个简单带权图 G=<V,E,W>及 u,v属于V,求 u,v之间的最短路径及距离. 下面介绍最短路径问题的一个有效算法,它是 E. W. Dijkstra 于 1959 ...

  2. Python 中的图:Dijkstra 算法

    介绍   图是最有用的数据结构之一.它们可用于对几乎所有事物进行建模--对象关系和网络是最常见的.图像可以表示为网格状的像素图,句子可以表示为单词的图.图表被用于各个领域,从制图到社会心理学,当然它们 ...

  3. python棋盘最短路径_Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例...

    本文实例讲述了Python数据结构与算法之图的最短路径(Dijkstra算法).分享给大家供大家参考,具体如下: # coding:utf-8 # Dijkstra算法--通过边实现松弛 # 指定一个 ...

  4. 数据结构之图:加权有向图与dijkstra算法找到最短路径,Python——28

    加权有向图与dijkstra算法找到最短路径 加权有向图的构造 最短路径问题与最短路径树 最短路径问题(The shortest path problem)定义 最短路径可以是时间花费最短,也可以是距 ...

  5. python路径规划算法可视化_路径规划问题:DIJKSTRA算法 以及Python实现

    一. DJKSTRA算法概述 我们可以将地图抽象为Graph的数据结构,然后利用Graph的广度优先遍历算法(Breadth-First Search, BFS)解决无权重的High-Level的地图 ...

  6. python广度优先算法最短路径_最短路径问题的Dijkstra算法 -python

    最短路径问题的Dijkstra算法 是由荷兰计算机科学家艾兹赫尔·戴克斯特拉提出.迪科斯彻算法使用了广度优先搜索解决非负权有向图的单源最短路径问题,算法最终得到一个最短路径树>    .该算法常 ...

  7. 三牛三虎过河问题--图的最短路径dijkstra算法--简单的Python实现

    问题:三头牛三只虎要过河,船需要一只动物来划,另外至多还能载一物,而只有一头牛和一只虎会划船,并且当虎的数量多于牛的数量时,虎要吃牛,请设计一个安全渡河方案,并使渡河次数尽量少. 我们用一个数组来表示 ...

  8. python基于广度优先(BFS)的迪杰斯特拉(Dijkstra)算法 求最短路径

    python深度优先与广度优先的遍历算法区别 首先要理解搜索步,一个完整的搜索步包括两个处理: a) 获得当前位置上,有几条路可供选择 b) 根据选择策略,选择其中一条路,并走到下个位置 广度优先:就 ...

  9. Python、C/C++混编实现最短路径可视化—Dijkstra算法

    摘 要   本文讲述的是主要是运用C/C++语言Dijkstra算法来完成交通图的存储.图中任一顶点到其余任意一顶点间的最短路径问题,并利用Python中的复杂网络分析库Networkx来绘制有向图以 ...

最新文章

  1. 最近在招标中评审出一个政府信息化软件
  2. 内核模式下的字符串操作
  3. Postgresql中文排序
  4. 高邮机器人_仲尼:省机器人项目荣获一等奖!高邮小学生是如何做到的?
  5. 第三次学JAVA再学不好就吃翔(part33)--final关键字
  6. 多线程三种同步方式(模拟银行取款)
  7. spark中dataframe解析_Spark 结构流处理介绍和入门教程
  8. dhcp协议_记录一次DHCP协议的学习过程
  9. 【渝粤教育】国家开放大学2019年春季 1117机电控制与可编程序控制 参考试题
  10. Python根据mask在原图上进行标记
  11. 学习python内一般函数知识
  12. mac怎么无线打印机连接到服务器,Mac上wifi打印机怎么用 wifi打印机连接使用教程...
  13. 项目启动阶段的主要工作
  14. 脉冲宽度调制pdm_脉冲宽度调制,脉宽调制
  15. 2021-07-27 Vue修改主页
  16. 从自建服务器到选择阿里云我们都应该慎重决定
  17. java汉字笔画排序
  18. Linux:使用upower命令查看电池信息
  19. 全媒体运营师胡耀文教你:如何提升线上活动参与度?分享5个技巧
  20. 使用邮件,有哪些邮箱格式模板需要注意的么?

热门文章

  1. 迁移学习(Transfer Learning)概述及代码实现
  2. 如何系统的学习游戏运营
  3. 虚拟机时间为什么不是快了就是慢了?
  4. Kafka The Definitive Guide
  5. Android ReplacementSpan 文字对齐问题
  6. 基于matlab的talbot效应光栅的计算机模拟[1],基于MATLAB的Talbot效应光栅的计算机模拟[1]...
  7. Python求一组数字的最大公约数和最小公倍数
  8. C语言结合gnuplot绘制离散时间系统的频率响应曲线
  9. 全民k歌爬虫 by--Python
  10. 米米冒险岛143v14无限制授权方式