Dijkstra算法详细介绍

Dijkstra’s Algorithm

简介

Dijkstra算法可以用于在有向无环图(DAG, Directed Acyclic Graph)中确定从单一源点(single source)出发到其他所有顶点的最短路径。有以下几点需要明确:

  1. “最短路径”是指沿途相邻两顶点间的权值总和最小的路径。
  2. 这个“权值总和”也叫距离,用数组d[]表示。对于单一源点s与某一个目的点u,若从s不可达u,则d[u]=正无穷大;若从s可达u,则可能存在多个可达路径,也就是有多个d[u]值,其中最短路径的距离用delta(s, u)表示,则显然有d[u]>=delta(s, u)。
  3. 所有权值都必须是非负的


松弛操作(Relaxation)

在做松弛操作之前,先要对图进行初始化,如下:
《Dijkstra算法详细介绍》
参数G为图,s为单一源点。初始化后,d[s]=0;顶点集中除s外的任意顶点v,有d[v]=正无穷大;顶点集中所有顶点的前驱被置空


接下来是松弛操作:
《Dijkstra算法详细介绍》
已知一条有向边u–>v,其权重为w;又已知d[u]与d[v]。那么,通过这条有向边从u到达v,能否使d[v]的值变得更小?显然,这就需要比较d[v]与d[u]+w谁更小:若d[u]+w更小,则我们找到了“更短的路径”,将d[u]+w的值赋给d[v],并修改v的前驱顶点为u;否则,不作任何改变。总之,松弛操作是一个尝试刷下限的过程。下图是一个松弛操作的例子:
《Dijkstra算法详细介绍》

表明了松弛操作可能遇到的两种情况:图(a),目前的下限,即d[v],是9,若通过u–>v,可使这个下限被刷到7,小于9,是个好主意,采纳,修改d[v]为7并修改顶点v的前驱为u;图(b),目前的下限是6,若通过u–>v,这个下限居然会变成7,大于6,所以我们拒绝,于是什么都不做。

Dijkstra算法

《Dijkstra算法详细介绍》


进一步描述Dijkstra算法:

  1. 执行初始化操作Init(G, s)。
  2. 建立两个顶点集合S、Q;S设置为空集,Q设置为包含图G中的所有顶点(当然,这些顶点都经过了初始化:d[s]=0、d[除s之外]=正无穷大、所有顶点的前驱都置空)。
  3. 维护顶点集合S、Q。如何维护呢?第一步,从Q中取出d[]值最小的顶点u,放入S;第二步,对所有u可以直接到达的顶点v,执行有向边u–>v的松弛操作。以上两步每执行一次,Q就少一个顶点,S就多一个顶点,直到Q为空,算法结束。


An example: Dijkstra’s Algo walk-through

下面是一个例子,通过对Dijkstra算法执行过程的逐步模拟,可以加深对算法的直观认识。

《Dijkstra算法详细介绍》

如图,源点是0,求源点到各顶点的最短路径。

《Dijkstra算法详细介绍》


 

    原文作者:Dijkstra算法
    原文地址: https://blog.csdn.net/ditian1027/article/details/21281617
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞