python实现Dijkstra静态寻路算法

  

<强>算法介绍

  

迪科斯彻算法使用了广度优先搜索解决赋权有向图或者无向图的单源最短路径问题,算法最终得到一个最短路径树。该算法常用于路由算法或者作为其他图算法的一个子模块。

  

当然目前也有人将它用来处理物流方面,以获取代价最小的运送方案。

  

<强>算法思路

  

Dijkstra算法算法采用的是一种贪心的策略。

  

1。首先,声明一个数组说来保存源点到各个顶点的最短距离和一个保存已经找到了最短路径的顶点的集合t
  2.其次,原点年代的路径权重被赋为0 (dis [s]=0)。若对于顶点年代存在能直接到达的边(s, m),则把说[m]设为w (s, m),同时把所有其他(s不能直接到达的)顶点的路径长度设为无穷大。初始时,集合T只有顶点。
  3.从说数组选择最小值,则该值就是源点年代到该值对应的顶点的最短路径,并且把该点加入到T中,此时完成一个顶点。
  4.再次,看看新加入的顶点是否可以到达其他顶点并且看看通过该顶点到达其他点的路径长度是否比源点直接到达短,如果是,那么就替换这些顶点在冥府中的值。
  5 .最后,从冥府中找出最小值,重复上述动作,直到T中包含了图的所有顶点(可以到达的)。

  

<强>算法图形演示

  

现在有图如下:

  

 python实现Dijkstra静态寻路算法

  

每个线的权重以及标识如图所示。

  

  

建立说数组和T数组。
  首先从起点一开始,将一个可以直接到达的顶点的权重记录在说数组中,无法直达的记录无穷大(当前使用飞行符表示无穷大)。

  

 python实现Dijkstra静态寻路算法

  

将当前选择的顶点加入数组T:

  

 python实现Dijkstra静态寻路算法

  

  

从dis数组中选择一个不在T数组中的顶点的最小权重值的顶点,当前选择为B顶点,并将B可以直接到达的顶点的相关权重和当前说中的权重值比较,如果当前说权重值大,则替换:

  

 python实现Dijkstra静态寻路算法

  

将B加入数组T:

  

 python实现Dijkstra静态寻路算法

  

<强>

  

依次选择顶点C:

  

 python实现Dijkstra静态寻路算法

  

将C加入数组T:

  

 python实现Dijkstra静态寻路算法

  

  

依次选择顶点D:

  

 python实现Dijkstra静态寻路算法

  

将D加入数组T:

  

 python实现Dijkstra静态寻路算法

  

  

依次选择顶点E:

  

 python实现Dijkstra静态寻路算法

  

将E加入数组T:

  

 python实现Dijkstra静态寻路算法

  

  

依次选择顶点F:

  

 python实现Dijkstra静态寻路算法

  

将F加入数组T:

  

 python实现Dijkstra静态寻路算法

  

因为所有的顶点都已经在T数组中了,算法结束。
  这样就求得了从一个点到各个顶点的最优解。

  

可以看到一顶点无法直达F顶点。

  

<强>代码表示:

  

(代码中使用999代表FFF)

        utf - 8编码:      进口复制   ”“”   图的表示方式   邻接矩阵   999代表无限远   ”“”   拖船=[[0,10,20,999,999,999]。   (999,0,999,70,999]。   (999、999、0,50岁,30岁,999年),   (999、999、999,0,999,999]。   (999、999、999、10 0 999),   (999、999、999、20、20 0]];      晚礼服=6;      #设置原点到其他定点的各个距离   说=copy.deepcopy(拖轮[0]);      def Dijkstra算法(G, v0):   ”“”   使用Dijkstra算法算法计算指定点v0到图G中任意点的最短路径的距离   正为设定的无限远距离值   ”“”   t=[];   minv=半;      len (t) & lt;=晚礼服:   t.append (minv);   #以当前点的中心向外扩散   晚礼服的w范围(0):   如果dis (minv) + G [minv] [w] & lt;说[w]:   说[w]=说[minv] + G [minv] [w]      tmp=1000;   因为我在范围(0,晚礼服):   tmpFlag=False;   j的范围(0,len (t)):   如果我==t [j]:   tmpFlag=True;   打破;      如果tmpFlag==True:   继续;      如果tmp比;说[我]:   tmp=说[我];   minv=我;      if __name__==癬_main__”:   迪杰斯特拉(拖轮,0);   打印说;   

python实现Dijkstra静态寻路算法