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,求源点到各顶点的最短路径。
相关文章推荐
- 单源最短路(Dijkstra算法) 详细介绍
- u-boot 详细介绍
- HTTP错误代码详细介绍
- Struts2 OGNL调用公共静态方法详细介绍
- background-position 用法详细介绍
- WIN API编程的详细介绍 (转载)
- listview 详细介绍
- 详细介绍Java中的堆、栈和常量池
- JSON和JSONP 详细介绍,很COOL
- 多功能的Silverlight控件User Interface Edition for Silverlight下载及详细介绍
- background-position 用法详细介绍
- display模版详细介绍
- Java 多态实现的详细介绍
- Servlet基础 及详细介绍(附带代码)
- 最详细的 node,npm的介绍、安装、使用
- 详细介绍用JBuilder9开发的Struts实例
- 详细介绍ORACLE sqlplus命令
- jquery的each()详细介绍
- Android AlertDialg 对话框详细介绍
- .NET压缩与解压控件Xceed Zip for .NET控件详细介绍使用方法及下载