您的位置:首页 > 其它

Dijkstra算法详细介绍

2014-03-15 21:10 246 查看

Dijkstra's Algorithm

简介

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

“最短路径”是指沿途相邻两顶点间的权值总和最小的路径。

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

松弛操作(Relaxation)

在做松弛操作之前,先要对图进行初始化,如下:



参数G为图,s为单一源点。初始化后,d[s]=0;顶点集中除s外的任意顶点v,有d[v]=正无穷大;顶点集中所有顶点的前驱被置空

接下来是松弛操作:



已知一条有向边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;否则,不作任何改变。总之,松弛操作是一个尝试刷下限的过程。下图是一个松弛操作的例子:



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

Dijkstra算法



进一步描述Dijkstra算法:

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

An example: Dijkstra's Algo walk-through

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



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



 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息