July算法研究1

来源:互联网 发布:java while 两个条件 编辑:程序博客网 时间:2024/05/22 06:50

学习《 经典算法研究系列:二、Dijkstra 算法初探 》小结;

July算法出处:http://blog.csdn.net/v_JULY_v/archive/2010/12/24/6096981.aspx

 

Dijkstra算法思想:

初始条件:

(1)图G,顶点集合V,边集E;

(2)d[v]:用于存放从原点到其余各点的最短路径权重;

        S:用于存放已经求得最短路径的顶点集合;

        U:用于存放没有求得最短路径的顶点集合;

        previous[v]=u:表示访问当前节点v的前驱访问节点是u;

 

 

 

算法思想:

 

(1)将所有顶点的最短路径权值数组初始化为infinity;同时将所有顶点的previous[]初始化为undefined;

(2)将d[s]=0;

(3)S=空集;U=V;

(4)while(U不为空)

           <1>u=从U中选出: 上次新加入的节点之后,更新从这个顶点可达的节点的权值的最小值;

           <2>将u加入S集合;

           <3>更新以s->...->u开始到u可达节点v权值,以及将这些节点previous[v]=u;

 

核心:<1>简单方法;二叉/项堆、斐波那契堆;

        <3>松弛技术relax(u,v,w);

 

 

算法:

 1  function Dijkstra(G, w, s)
 2     for each vertex v in V[G]                        // 初始化
 3           d[v] := infinity
 4           previous[v] := undefined
 5     d[s] := 0
 6     S := empty set
 7     Q := set of all vertices
 8     while Q is not an empty set                      // Dijkstra演算法主體
 9           u := Extract_Min(Q)
10           S := S union {u}
11           for each edge (u,v) outgoing from u
12                  if d[v] > d[u] + w(u,v)             // 拓展边(u,v)
13                        d[v] := d[u] + w(u,v)
14                        previous[v] := u