本文借鉴于张广河教授主编的《数据结构》,对其中的代码进行了完善。

从某源点到其余各顶点的最短路径

Dijkstra算法可用于求解图中某源点到其余各顶点的最短路径。假设G={V,{E}}是含有n个顶点的有向图,以该图中顶点v为源点,使用Dijkstra算法求顶点v到图中其余各顶点的最短路径的基本思想如下:

使用集合S记录已求得最短路径的终点,初始时S={v}。

选择一条长度最小的最短路径,该路径的终点w属于V-S,将w并入S,并将该最短路径的长度记为Dw。

对于V-S中任一顶点是s,将源点到顶点s的最短路径长度记为Ds,并将顶点w到顶点s的弧的权值记为Dws,若Dw+Dws

则将源点到顶点s的最短路径长度修改为Dw+Ds=ws。

重复执行2和3,知道S=V。

为了实现算法,

使用邻接矩阵Arcs存储有向网,当i=j时,Arcs[i][j]=0;当i!=j时,若下标为i的顶点到下标为j的顶点有弧且弧的权值为w,则Arcs[i][j]=w,否则Arcs[i][j]=float(‘inf')即无穷大。

使用Dist存储源点到每一个终点的最短路径长度。

使用列表Path存储每一条最短路径中倒数第二个顶点的下标。

使用flag记录每一个顶点是否已经求得最短路径,在思想中即是判断顶点是属于V集合,还是属于V-S集合。

代码实现

#构造有向图Graph

class Graph:

def __init__(self,graph,labels): #labels为标点名称

self.Arcs=graph

self.VertexNum=graph.shape[0]

self.labels=labels

def Dijkstra(self,Vertex,EndNode): #Vertex为源点,EndNode为终点

Dist=[[] for i in range(self.VertexNum)] #存储源点到每一个终点的最短路径的长度

Path=[[] for i in range(self.VertexNum)] #存储每一条最短路径中倒数第二个顶点的下标

flag=[[] for i in range(self.VertexNum)] #记录每一个顶点是否求得最短路径

index=0

#初始化

while index

Dist[index]=self.Arcs[Vertex][index]

flag[index]=0

if self.Arcs[Vertex][index]

Path[index]=Vertex

else:

Path[index]=-1 #表示从顶点Vertex到index无路径

index+=1

flag[Vertex]=1

Path[Vertex]=0

Dist[Vertex]=0

index=1

while index

MinDist=float('inf')

j=0

while j

if flag[j]==0 and Dist[j]

tVertex=j #tVertex为目前从V-S集合中找出的距离源点Vertex最断路径的顶点

MinDist=Dist[j]

j+=1

flag[tVertex]=1

EndVertex=0

MinDist=float('inf') #表示无穷大,若两点间的距离小于MinDist说明两点间有路径

#更新Dist列表,符合思想中第三条

while EndVertex

if flag[EndVertex]==0:

if self.Arcs[tVertex][EndVertex]

tVertex]+self.Arcs[tVertex][EndVertex]

Dist[EndVertex]=Dist[tVertex]+self.Arcs[tVertex][EndVertex]

Path[EndVertex]=tVertex

EndVertex+=1

index+=1

vertex_endnode_path=[] #存储从源点到终点的最短路径

return Dist[EndNode],start_end_Path(Path,Vertex,EndNode,vertex_endnode_path)

#根据本文上述定义的Path递归求路径

def start_end_Path(Path,start,endnode,path):

if start==endnode:

path.append(start)

else:

path.append(endnode)

start_end_Path(Path,start,Path[endnode],path)

return path

if __name__=='__main__':

#float('inf')表示无穷

graph=np.array([[0,6,5,float('inf'),float('inf'),float('inf')],

[float('inf'),0,2,8,float('inf'),float('inf')],

[float('inf'),float('inf'),0,float('inf'),3,float('inf')],

[float('inf'),float('inf'),7,0,float('inf'),9],

[float('inf'),float('inf'),float('inf'),float('inf'),0,9],

[float('inf'),float('inf'),float('inf'),float('inf'),0]])

G=Graph(graph,labels=['a','b','c','d','e','f'])

start=input('请输入源点')

endnode=input('请输入终点')

dist,path=Dijkstra(G,G.labels.index(start),G.labels.index(endnode))

Path=[]

for i in range(len(path)):

Path.append(G.labels[path[len(path)-1-i]])

print('从顶点{}到顶点{}的最短路径为:\n{}\n最短路径长度为:{}'.format(start,endnode,Path,dist))

输出结果如下:

请输入源点

a

请输入终点

f

从顶点a到顶点f的最短路径为:

['a', 'c', 'e', 'f']

最短路径长度为:17

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

python 最短路径算法_python Dijkstra算法实现最短路径问题的方法相关推荐

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

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

  2. 迪杰斯特拉算法(Dijkstra)求最短路径Python

    迪杰斯塔拉(Dijkstra)算法求最短路径 序 关于Dijkstra Dijkstra算法讲解 Dijkstra算法的弊端 第一步:进行初始化 第二步:主程序开始 又是初始化 核心的核心[^5] 最 ...

  3. 【算法】Dijkstra算法(单源最短路径问题) 邻接矩阵和邻接表实现

    Dijkstra算法可使用的前提:不存在负圈. 负圈:负圈又称负环,就是说一个全部由负权的边组成的环,这样的话不存在最短路,因为每在环中转一圈路径总长就会边小. 算法描述: 1.找到最短距离已确定的顶 ...

  4. 最短路径问题:Dijkstra算法详解

    前言  Nobody can go back and start a new beginning,but anyone can start today and make a new ending.  ...

  5. 贪心算法之用优先队列解决最短路径问题(Dijkstra算法)

    1.问题 最短路径问题(Dijkstra算法)用 优先队列实现,问题描述和分析和优先队列先看前面我的几篇博客 贪心算法之最短路径问题(Dijkstra算法) C++之STL之priority_queu ...

  6. 【最短路径】之Dijkstra算法

    最短路径 单源最短路径:计算源点到其他各顶点的最短路径的长度 全局最短路径:图中任意两点的最短路径 Dijkstra.Bellman-Ford.SPFA求单源最短路径 Floyed可以求全局最短路径, ...

  7. 【最短路径】:Dijkstra算法、SPFA算法、Bellman-Ford算法和Floyd-Warshall算法

    求最短路径最常用的算法有: Dijkstra算法.SPFA算法.Bellman-Ford算法和Floyd-Warshall算法. Dijkstra算法.SPFA算法.Bellman-Ford算法这三个 ...

  8. 最短路径问题(Floyd算法、Dijkstra算法、Bellman-Ford算法、SPFA算法)

    导入 最短路径问题是指在一幅带权图中,找出连接两个顶点之间的所有路径中,边权和最短的那一条.如下图就是一幅带权图,边上的数字就代表该边的权值.解决最短路径问题有多种不同的算法,本文将对它们的基本思想与 ...

  9. 学习进度2012-6-26(动态规划算法、Prim算法、Dijkstra算法)

    今天学习下三个算法:动态规划算法.Prim算法.Dijkstra算法,将自己理解的逻辑略作总结. 1.动态规划算法是选取两个字符串的最长子序列的解法作为切入点学习,在公司午休时间将代码写了下,初步测试 ...

最新文章

  1. Educational Codeforces Round 106 (Rated for Div. 2)(A ~ E)题解(每日训练 Day.16 )
  2. 捉虫记---查看变量,整数转浮点
  3. 京东产品负责人:数据如何高效驱动供应链?
  4. 用设计模式去掉没必要的状态变量 —— 状态模式
  5. 关于java结构中描述正确的是_下列关于Java中类的构造方法的描述,正确的是()...
  6. c++11 你需要知道这些就够了
  7. .NET Standard,有哪些替代方案?
  8. OpenCV(一)---支持向量机 SVM
  9. 传感器实验——LCD显示SHT20
  10. 数据分析 - 预测模型(学习笔记)
  11. 【Python】P2440 木材加工
  12. 115、闪点、燃点、自然点的概念
  13. 这姐姐呀的人工智能实训1:机器人语料库数据集准备
  14. [memo] dlopen 与 --export-dynamic
  15. MySQL--数据导入导出
  16. Excel学习——countif函数
  17. WR720N硬改16M flash
  18. 米洛个人修炼术:如何倍增你的功力修行速度达成健康体魄
  19. 跟着SY速学Ubuntu系列一:作为程序员,安装Ubuntu后我做的事情。
  20. DB2ADVIS returning error -220

热门文章

  1. Leetcode--279. 完全平方数
  2. linux 普通io实现pwm,用普通IO口做PWM输出 - 51单片机 - 电子工程世界-论坛 - 手机版...
  3. c++中unordered_map的坑
  4. oracle13001,安装oracle11g 遇到INS-13001环境不知足最低要求 解决方法
  5. 管理口地址 ibm_WAN口有IP地址上不了网如何解决 WAN口有IP地址上不了网解决方法【详解】...
  6. 自学python在家怎么上班_【经验分享】转行如何自学Python并且找到工作,分享自己心得...
  7. 逐行对比两个文件内容的好用软件
  8. ❤JavaScript系列6部曲:语法篇(万字长文)❤
  9. js 逆向分析的神器 --- v_jstools
  10. Spring Data JPA 从入门到精通~思维导图