Private Sub CommandSearch_Click()
Dim iCurrename As Integer
Dim iEndName As Integer
Dim iStartName As Integer
Dim sPathList As String
'开始搜索
If Me.ComboStart.ListIndex = 0 Or Me.ComboEnd.ListIndex = 0 Then
MsgBox "请选择“起点站”或“终点站”!"
Exit Sub
End If
iEndName = Me.ComboEnd.ListIndex
iCurrename = iEndName
iStartName = Me.ComboStart.ListIndex
sPathList = ""
Call SearchPath(Me.ComboStart.ListIndex, Me.ComboEnd.ListIndex)
'显示结果
Do While iCurrename <> iStartName
If (iPath(iCurrename) = 0) Then
Me.TextResult.Text = "没有路: " & sAddList(iStartName) & " 到" & sAddList(iEndName)& "!" & vbCrLf
Exit Sub
End If
sPathList = sAddList(iCurrename) & sPathList
GetResult (iCurrename)
sPathList = " -> " & sPathList
iCurrename = iPath(iCurrename)
Loop
sPathList = sAddList(iStartName) & sPathList
GetResult (iStartName)
' /* 打印显示距离 */
sPathList = "距离是: " & iPathLength(iEndName) & vbCrLf & sPathList
Me.TextResult.Text = sPathList
End Sub
Dim iCurrename As Integer
Dim iEndName As Integer
Dim iStartName As Integer
Dim sPathList As String
'开始搜索
If Me.ComboStart.ListIndex = 0 Or Me.ComboEnd.ListIndex = 0 Then
MsgBox "请选择“起点站”或“终点站”!"
Exit Sub
End If
iEndName = Me.ComboEnd.ListIndex
iCurrename = iEndName
iStartName = Me.ComboStart.ListIndex
sPathList = ""
Call SearchPath(Me.ComboStart.ListIndex, Me.ComboEnd.ListIndex)
'显示结果
Do While iCurrename <> iStartName
If (iPath(iCurrename) = 0) Then
Me.TextResult.Text = "没有路: " & sAddList(iStartName) & " 到" & sAddList(iEndName)& "!" & vbCrLf
Exit Sub
End If
sPathList = sAddList(iCurrename) & sPathList
GetResult (iCurrename)
sPathList = " -> " & sPathList
iCurrename = iPath(iCurrename)
Loop
sPathList = sAddList(iStartName) & sPathList
GetResult (iStartName)
' /* 打印显示距离 */
sPathList = "距离是: " & iPathLength(iEndName) & vbCrLf & sPathList
Me.TextResult.Text = sPathList
End Sub
Private Sub CommandSearch_Click()
Dim iCurrename As Integer
Dim iEndName As Integer
Dim iStartName As Integer
Dim sPathList As String
'开始搜索
''未选择起点或终点情况
If Me.ComboStart.ListIndex = 0 Or Me.ComboEnd.ListIndex = 0 Then
MsgBox "请选择“起点站”或“终点站”!"
Exit Sub
End If
''传入所设置的起点和终点。用index值来做点的名字。icurrename的作用:是用来标志某次所搜的???
iEndName = Me.ComboEnd.ListIndex
iCurrename = iEndName
iStartName = Me.ComboStart.ListIndex
sPathList = "" '清空显示列表,以保存下次查到的内容
'调用最短路径搜索函数。SearchPath具体实现???
Call SearchPath(Me.ComboStart.ListIndex, Me.ComboEnd.ListIndex)
'显示结果,ipath是路径集合
Do While iCurrename <> iStartName '不是查自己到自己的最短路径情况时。Me 在代码正在执行的地方提供引用具体实例的方法
If (iPath(iCurrename) = 0) Then 'icurename是指谁,用来标记某次搜索???iPath(iCurrename) = 0是指ipath这个集合中参数为icurename的一项内容为空,即无路径
Me.TextResult.Text = "没有路: " & sAddList(iStartName) & " 到" & sAddList(iEndName) & "!" & vbCrLf '&强制连接符 vbCrLf是VB中用于表示“回车换行”的字符串常数(长度为2字节)
Exit Sub
End If
'什么意思???
sPathList = sAddList(iCurrename) & sPathList
GetResult (iCurrename)
sPathList = " -> " & sPathList
iCurrename = iPath(iCurrename)
Loop
'以起点为准得出最短路径
sPathList = sAddList(iStartName) & sPathList
GetResult (iStartName)
' 打印显示距离,sPathList是显示的内容,格式:距离是几 最短路径。sPathList在哪定义的,怎样定义的???
sPathList = "距离是: " & iPathLength(iEndName) & vbCrLf & sPathList
Me.TextResult.Text = sPathList
End SubPrivate Sub Form_Load()
Call LoadDate
End Sub
Private Sub LoadDate()
'初始化程序界面,填充数据
''先调用创建地图函数,关联地图
Call CreateMap 'creatmap的具体功能及实现???
'初始化程序界面,填充起点和终点的名称
Dim iLoop As Integer
''清除原有内容
Me.ComboStart.Clear
Me.ComboEnd.Clear
'填充数据
''填充index=0
Me.ComboStart.AddItem ("请选择起点")
Me.ComboStart.ListIndex = 0
Me.ComboEnd.AddItem ("请选择终点")
Me.ComboEnd.ListIndex = 0
''填充index=1toiaddcount,sAddList(iLoop)是最短路径列表,里面存了要添加到Combo里的项目,
''iLoop就是下标,For iLoop= 1 To iAddCount就是把东西全部添加进ComboStart和ComboEnd里。
For iLoop = 1 To iAddCount 'iaddcount可添加的点的数目的最大值
Me.ComboStart.AddItem (sAddList(iLoop)) 'sAddList的具体功能及实现???
Me.ComboEnd.AddItem (sAddList(iLoop))
Next
End Sub
Option Explicit
Public sAddList() As String '最短路径列表'''string是OLE标准的BSTR即宽字符指针
Public iAddCount As String '点的数目的最大值
Public iAddMap() As Long '地址地图
Public iAddSelect() As String '选择的点的集
Public iPathLength() As Long '路径距离集
Public iPath() As Integer '路径集合Const NoPath = 999999999
Dim sResult() As String
Dim iResultSize As Integer '结果数据Dim iLoop As Integer
Dim jLoop As IntegerPublic Sub CreateMap()
Dim conn As New ADODB.Connection 'ADODB是数据库访问组件,connection是其中的一个对象
Dim rs As New ADODB.Recordset '记录集
Dim sConn As String
'打开路径列表
sConn = App.Path & "\db.mdb"
sConn = "provider=microsoft.jet.oledb.4.0;data source= " & sConn & ";persist security info=false " conn.ConnectionString = sConn
conn.Open
rs.Open "Select DISTINCT StartName From tmpPath", conn, adOpenStatic
'地点数量
iAddCount = rs.RecordCount
ReDim sAddList(1 To iAddCount)
ReDim iAddMap(1 To iAddCount, 1 To iAddCount)
ReDim iAddSelect(1 To iAddCount)
ReDim iPathLength(1 To iAddCount)
ReDim iPath(1 To iAddCount)
ReDim sResult(1 To iAddCount)
iLoop = 1
While Not rs.EOF
sAddList(iLoop) = rs.Fields(0).Value
iLoop = iLoop + 1
rs.MoveNext
Wend
'关掉
rs.Close Dim sStartName As String
Dim sEndName As String
Dim sPathLength As String
Dim iEndIndex As Integer
rs.Open "Select * From tmpPath ", conn, adOpenStatic
While Not rs.EOF
sStartName = rs.Fields("StartName").Value & ""
sEndName = rs.Fields("EndName").Value & ""
sPathLength = rs.Fields("PathLength").Value & ""
iAddMap(GetNameIndex(sStartName), GetNameIndex(sEndName)) = sPathLength
rs.MoveNext
Wend
rs.Close
Set rs = Nothing
'把没有数据的地方填充成0
For iLoop = 1 To iAddCount
For jLoop = 1 To iAddCount
If iAddMap(iLoop, jLoop) = Null Then
iAddMap(iLoop, jLoop) = 0
End If
Next
Next
For iLoop = 1 To iAddCount
iAddSelect(iLoop) = "False"
iPathLength(iLoop) = NoPath
iPath(iLoop) = 0
Next
End Sub
'算法
Public Function SearchPath(iStartName As Integer, iEndName As Integer)
'iStartName '开始点
'iEndName '结束点
Dim iCurrename As Integer
Dim iTotalLength As Integer Dim bCanSearch As Boolean
iCurrename = iStartName
iTotalLength = 0 '设定开始距离
bCanSearch = True
Dim min As Long
'//下面的代码初始化其他数组
For iLoop = 1 To iAddCount
'初始化选择点:1表示没有选中,0表示被选中
iAddSelect(iLoop) = "False"
iPathLength(iLoop) = NoPath
iPath(iLoop) = 0
Next
'从图上显示当前第一个节点被搜索
iAddSelect(iCurrename) = "True"
iPathLength(iCurrename) = 0
iResultSize = 0
Do While bCanSearch
'/* 更改数组中的距离 */
For iLoop = 1 To iAddCount
If ((iAddMap(iCurrename, iLoop) <> 0) And _
((iPathLength(iLoop)) > (iAddMap(iCurrename, iLoop)) + iTotalLength)) Then
iPathLength(iLoop) = iAddMap(iCurrename, iLoop) + iTotalLength
iPath(iLoop) = iCurrename
End If
Next iLoop
min = NoPath For iLoop = 1 To iAddCount
If ((iPathLength(iLoop) < min) And (iAddSelect(iLoop) = "False")) Then
min = iPathLength(iLoop)
iCurrename = iLoop
iTotalLength = iPathLength(iLoop)
End If
Next iLoop
iAddSelect(iCurrename) = "True"
'/* 处理完成所有的顶点之后停止 */
If (min = NoPath) Then
bCanSearch = False
End If
'测试代码
DoEvents
LoopEnd Function
Private Function GetNameIndex(sName As String) As Integer
'获得当前的地址在数组中的编号
Dim iIndex As Integer
For iLoop = 1 To iAddCount
If sAddList(iLoop) = sName Then
iIndex = iLoop
GetNameIndex = iIndex
Exit Function
End If
Next
GetNameIndex = iIndex
End Function
Public Sub GetResult(index As Integer)
iResultSize = iResultSize + 1
sResult(iResultSize) = index
End Sub
sAddList 就是从 数据库中提取出来的资料。
ReDim sAddList(1 To iAddCount)
iLoop = 1
While Not rs.EOF
sAddList(iLoop) = rs.Fields(0).Value
iLoop = iLoop + 1
rs.MoveNext
Wend