python实现狄克斯特拉算法

  

<强>一、简介

  

是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题。迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止

  

<强>二,步骤

  

(1)找出“最便宜”的节点,即可在最短时间内到达的节点。
  (2)更新该节点的邻居的开销,其含义将稍后介绍。
  (3)重复这个过程,直到对图中的每个节点都这样做了。
  (4)计算最终路径。
  

  

<强>三、图解

  

 python实现狄克斯特拉算法

  

上图中包括5个节点,箭头表示方向,线上的数字表示消耗时间。
  首先根据上图做出一个初始表(父节点代表从哪个节点到达该节点):

  

 python实现狄克斯特拉算法”> <br/>
  </p>
  <p>然后从“起”点开始,根据图中的信息更新一下表,由于从“起”点不能直接到达”终点”节点,所以耗时为∞(无穷大):<br/>
  </p>
  <p> <img src=

  

有了这个表我们可以根据算法的步骤往下进行了。
  

  

第一步:找出“最便宜”的节点,这里是节点B:
  

  

 python实现狄克斯特拉算法”> <br/>
  </p>
  <p>第二步:更新该节点的邻居的开销,根据图从B出发可以到达一个和“终点”节点,B目前的消耗2 + B到的消耗3=5,5小于原来一个的消耗6,所以更新节点一个相关的行:<br/>
  </p>
  <p> <img src=   # - *编码:utf - 8 - *   #用散列表实现图的关系   #创建节点的开销表,开销是指从“起”点到该节点的权重   图={}   图(“开始”)={}   图(“开始”)[a]=6   图["开始"][b]=2      图[a]={}   图[a]["结束")=1      图[b]={}   图[b] [a]=3   图[b]["结束"]=5   图(“结束”)={}      #无穷大   ∞=浮动(正)   成本={}   成本[a]=6   成本[b]=2   ["结束"]=无穷成本      #父节点散列的表   父母={}   父母[a]=翱肌?   父母[b]=翱肌?   父母(“结束”)=没有      #已经处理过的节点,需要记录   处理=[]         #找到开销最小的节点   def find_lowest_cost_node(成本):   #初始化数据   lowest_cost=无穷大   lowest_cost_node=没有   #遍历所有节点   节点的成本:   #该节点没有被处理   如果不是在处理节点:   #如果当前节点的开销比已经存在的开销小,则更新该节点为开销最小的节点   如果成本(节点)& lt;lowest_cost:   lowest_cost=成本(节点)   lowest_cost_node=节点   返回lowest_cost_node         #找到最短路径   def find_shortest_path ():   节点="结束"   shortest_path=(“结束”)   虽然父母(节点)!=翱肌?   shortest_path.append(父母(节点))   节点=父母(节点)   shortest_path.append(“开始”)   返回shortest_path         #寻找加权的最短路径   def dijkstra算法():   #查询到目前开销最小的节点   节点=find_lowest_cost_node(成本)   #只要有开销最小的节点就循环(这个而循环在所有节点都被处理过后结束)   虽然节点不是没有:   #获取该节点当前开销   成本=成本(节点)   #获取该节点相邻的节点   邻居=图(节点)   #遍历当前节点的所有邻居   在neighbors.keys n ():   #计算经过当前节点到达相邻结点的开销,即当前节点的开销加上当前节点到相邻节点的开销   new_cost=成本+邻居[n]   #如果经当前节点前往该邻居更近,就更新该邻居的开销   如果new_cost & lt;成本[n]:   [n]=new_cost成本   同号时将该邻居的父节点设置为当前节点   父母[n]=节点   #将当前节点标记为处理过   processed.append(节点)   #找出接下来要处理的节点,并循环   节点=find_lowest_cost_node(成本)   #循环完毕说明所有节点都已经处理完毕   shortest_path=find_shortest_path ()   shortest_path.reverse ()   打印(shortest_path)   #测试   迪杰斯特拉()

python实现狄克斯特拉算法