开发工具:
文件大小: 176kb
下载次数: 0
上传时间: 2008-10-26
详细说明: vb+mapinfo 实现最短路 'NoNode1 起始点编码 'NoNode2 结束点编码 'nNode 为网中最大的节点数 'NoNode(i) 节点编码 'LinkN(i) 与i点相连Line个数 'LinkNi(i) 与i点相连Line端点存放序号 'iLL=LinkNi(LL) - i + 1 'LinkNo(iLL) 与i点相连Line端点顺序编号 'LinkList(iLL) 与i点相连Line端点距离 'nNodeShortPath 最短路径节点数 'NodeShortPath 最短路径节点序号 Public Sub ShortPathSearch(NoNode1 As Integer, NoNode2 As Integer, nNode As Integer, NoNode() As Integer, LinkN () As Integer, LinkNi() As Integer, LinkNo() As Integer, LinkDis() As Double, nNodeShortPath As Integer, NodeShortPath() As Integer, ShortPath As Double) Dim II As Integer, I As Integer, J As Integer, LL As Integer, iLL As Integer Dim iNode As Integer Dim S As Single, MinS As Single, MinPoint As Integer Dim NodeCheck() As Boolean '标记已经查过的点 Dim NodeUse() As Boolean '标记已经作为结果点使用过的点 Dim RS() As Single '假设从起点到任一点的距离都为无穷大 Dim result() As Single '存放结果长度 Dim ResultNo() As Integer '存放结果节点编号 Dim iResult As Integer Dim No() As Integer Dim StartNo As Integer, EndNo As Integer 'Begin根据编码,搜索序号 StartNo = 0 EndNo = 0 For I = 1 To nNode If (NoNode(I) = NoNode1) Then StartNo = I End If If (NoNode(I) = NoNode2) Then EndNo = I End If If (StartNo > 0 And EndNo > 0) Then Exit For Next I 'End根据编码,搜索序号 ReDim NodeCheck(1 To nNode), NodeUse(1 To nNode) ReDim RS(1 To nNode), result(1 To nNode), ResultNo(1 To nNode) For I = 1 To nNode NodeCheck(I) = False '标记未经查过的点。 NodeUse(I) = False '标记未作为结果点使用过的点 RS(I) = 1E+38 '假设从起点到任一点的距离都为无穷大 Next I LL = StartNo '设置开始点。 NodeUse(LL) = True '标记开始点为真。即已经作为结果点使用过。 J = 0 For iNode = 1 To nNode '先从与开始点相连的起点寻找 For I = 1 To LinkN(LL) '以与LL点相连的起点的个数循环 iLL = LinkNi(LL) + I - 1 iResult = LinkNo(iLL) '找出与LL点相连的起点的点号 If NodeCheck(iResult) = False Then '如果没查过,则进行 S = LinkDis(iLL) + result(LL) '找出长度并求和 If NodeUse(iResult) = True Then '如果已经作为结果点,判断哪一个长 If S <= RS(iResult) Then '如果这一点到起点的长度比现在的路线长,替代 RS(iResult) = S result(iResult) = S '设置到这点的最短路径长度 ResultNo(iResult) = LL End If Else '如果上面的条件都不符合,则进行下面的语句 NodeCheck(iResult) = True RS(iResult) = S result(iResult) = S ResultNo(iResult) = LL J = J + 1 '每找到一个点加一,为了下面的判断 ReDim Preserve No(1 To J) '重新定义数组并使其值为当前的点号 No(J) = iResult End If End If Next I '设置最小为无穷大,最短路径点为空 MinS = 1E+38 MinPoint = 0 '找出已经查过点中长度最短的点 For I = iNode To J If RS(No(I)) < MinS Then II = I MinS = RS(No(I)) MinPoint = No(I) End If Next I '如果没有结果,即起点与终点没有通路,则退出程序 If MinS = 1E+38 Then MsgBox "即起点与终点没有通路!", vbOKOnly, "关于搜索最短路径" Exit Sub End If '将两点互换,减少循环。 No(II) = No(iNode) No(iNode) = MinPoint '标记已经作为结果点判断过 NodeUse(MinPoint) = True LL = MinPoint '判断结果点是否等于终点,如果等于则已经找到最短路径 If MinPoint = EndNo Then Exit For Next iNode 'Begin检索最短路径节点 ReDim NodeShortPath(1 To nNode) nNodeShortPath = 1 LL = MinPoint NodeShortPath(nNodeShortPath) = LL Do LL = ResultNo(LL) nNodeShortPath = nNodeShortPath + 1 NodeShortPath(nNodeShortPath) = LL If (LL = StartNo) Then Exit Do Loop 'End检索最短路径节点 ShortPath = result(EndNo) End Sub ...展开收缩
(系统自动生成,下载前可以参看下载内容)
下载文件列表
相关说明
- 本站资源为会员上传分享交流与学习,如有侵犯您的权益,请联系我们删除.
- 本站是交换下载平台,提供交流渠道,下载内容来自于网络,除下载问题外,其它问题请自行百度。
- 本站已设置防盗链,请勿用迅雷、QQ旋风等多线程下载软件下载资源,下载后用WinRAR最新版进行解压.
- 如果您发现内容无法下载,请稍后再次尝试;或者到消费记录里找到下载记录反馈给我们.
- 下载后发现下载的内容跟说明不相乎,请到消费记录里找到下载记录反馈给我们,经确认后退回积分.
- 如下载前有疑问,可以通过点击"提供者"的名字,查看对方的联系方式,联系对方咨询.