现在的位置: 首页 > 综合 > 正文

python dijkstra

2018年03月15日 ⁄ 综合 ⁄ 共 1200字 ⁄ 字号 评论关闭

    Dijkstra算法和前一篇的Prim算法非常像,区别就在于Dijkstra算法向最短路径树(SPT)中添加顶点的时候,是按照ta与源点的距离顺序进行的。OSPF动态路由协议就是用的Dijkstra算法。下面还以那个图的例子为例:

代码如下:

  1. _=float('inf')  
  2.   
  3. def dijkstra(graph,n):  
  4.     dis=[0]*n  
  5.     flag=[False]*n  
  6.     pre=[0]*n  
  7.     flag[0]=True  
  8.     k=0  
  9.     for i in range(n):  
  10.         dis[i]=graph[k][i]  
  11.   
  12.     for j in range(n-1):  
  13.         mini=_  
  14.         for i in range(n):  
  15.             if dis[i]<mini and not flag[i]:  
  16.                 mini=dis[i]  
  17.                 k=i  
  18.         if k==0:#不连通  
  19.             return  
  20.         flag[k]=True  
  21.         for i in range(n):  
  22.             if dis[i]>dis[k]+graph[k][i]:  
  23.                 dis[i]=dis[k]+graph[k][i]  
  24.                 pre[i]=k  
  25. #       print(k)  
  26.     return dis,pre  
  27.   
  28. if __name__=='__main__':  
  29.     n=6  
  30.     graph=[  
  31.             [0,6,3,_,_,_],  
  32.             [6,0,2,5,_,_],  
  33.             [3,2,0,3,4,_],  
  34.             [_,5,3,0,2,3],  
  35.             [_,_,4,2,0,5],  
  36.             [_,_,_,3,5,0],  
  37.             ]  
  38.     dis,pre=dijkstra(graph,n)  
  39.     print(dis)  
  40.     print(pre)  

        输出如下:

  1. [0, 5, 3, 6, 7, 9]  
  2. [0, 2, 0, 2, 2, 3]  

        按照输出结果用粗线表示最短路径树如下:

http://tm.pm.netease.com:8175/projects/runner/wiki/Wiki

 

http://corp.netease.com/coremail/

【上篇】
【下篇】

抱歉!评论已关闭.