Dijkstra最短路径算法实现

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Dijkstra最短路径算法实现

摘要:本文主要通过对Dijkstra算法较为准确的描述,结合具体图例详细论证了其具体求解最短路径过程;并简要论述了用VB实现最短路径算法的基本思路和主要代码功能,使数据结构算法和实际程序操作能够紧密结合,从而进一步加深对算法的认识理解。

关键词:最短路径;Dijkstra算法;VB

1 Dijkstra算法

Dijkstra算法是典型最短路算法,解决的是有向图中单个源点到其他顶点的最短路径问题。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。

Dijkstra算法将网络结点分成未标记结点、临时标记结点和永久标记结点。网络中所有结点首先初始化为标记结点,在搜索过程中和最短路径中的结点相连通的结点为临时标记结点,每次循环都是从临时标记结点中搜索距源点路径长度最短的结点作为永久标记结点,直至找到目标结点或者所有的结点都成为永久标记结点来结束算法。以下为算法示例。

在图1中,查询结点1到结点6的最短路径的标号过程如下:(*代表永久性标号)

图1 算法示例

所以结点1到结点6的最短距离为8,进行逆推求最短路径。结点6和结点5之间的永久标号之差是8-6=线路(5,6)的长度,所以可以回到结点5。结点5和结点2之间的永久标号之差是6-4=线路(2,5)的长度,回到结点2,结点2和结点1的永久标号之差4=线路(1,2)的长度,回到起点1,得到最短路径1-2-5-6。在结点5时,还可以回到结点3得到最短路径1-3-5-6。

2 程序源代码

2.1 数据结构定义

定义图表中的结点(结点标记、坐标等)、线路(线段的编号、起点及终点坐标、长度等),结点邻接矩阵数组、标记结点是否获得永久标号,结点数、线路数等主要元素的数据结构。

2.2 程序实现方法

Function yjbh() As Boolean ‘判断是否所有结点都获得永久标号Dim tempyjbh As Boolean

tempyjbh = True

For i = 1 To nnode

If yjdb(i) = False Then

tempyjbh = False

Exit For

End If

Next i

yjbh = tempyjbh

End Function

Public Function minnode() ‘寻找具有最小临时标号的结点

Dim mindist As Double, minnodeno As Integer, i As Integer mindist = 1E+38

For i = 1 To nnode

If yjdb(i) = False Then

If distvector(i) < mindist Then

mindist = distvector(i)

minnodeno = i

End If

End If

Next i

oldtempstartno = tempstartno

tempstartno = minnodeno

distvector(tempstartno) = mindist

‘新获得永久标号的结点

yjdb(tempstartno) = True

End Function

‘省略更新与刚获得永久标号节点相连的各节点的邻接距离函数

2.3 程序运行结果

通过对上述主要函数的循环调用,从终点逆推求出起点到终点的最短路径。

3 小结

Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的结点很多,所以效率低。根据实际定义的数据结构,建立相应的数据库,结合MapInfo等专业地理数据软件运用本算法、经过增加条件判断减少循环比较次数可以较好的解决电子地图中遇到关于路径查询的实际问题。

图2 程序运行结果

参考文献:

[1] 谭浩强.C程序设计(第2版).北京:清华大学出版社,2000.

[2] 严蔚敏,吴伟民.数据结构.北京:清华大学出版社,2001.

相关文档
最新文档