当前位置:编程学习 > VB >>

高分求VB下求mapx的最短路径

高分求VB下求mapx的最短路径,我QQ466748009
答案:

Const max_vertex = 6 '最大顶点数
Const max_arc = 8 '最大边数
Dim P(1 To max_vertex, 1 To max_vertex) As Integer '路径
Dim D(1 To max_vertex, 1 To max_vertex) As Integer '存放距离
Dim arc_pos(1 To max_vertex, 1 To max_vertex) As Integer '边在图中的编号

Sub short_path()

'最短路径
Const Infinity = 2767 '无穷大
Dim adjmatrix(1 To max_vertex, 1 To max_vertex) As Integer '邻接矩阵
Dim vex_pos(1 To max_vertex) As Integer '顶点在图中的编号
Dim vexnum As Integer, arcnum As Integer '图的当前顶点数和弧数

vexnum = 6
Dim ii As Integer
For ii = 1 To vexnum
vex_pos(ii) = ii '顶点位置
Next ii

'初始化邻接矩阵
Dim jj As Integer
Dim k As Integer
For jj = 1 To vexnum
For k = 1 To vexnum
If jj = k Then
adjmatrix(jj, k) = 0
Else
adjmatrix(jj, k) = Infinity
End If
Next k
Next jj

'以下为给各边赋权值
arcnum = 8
adjmatrix(1, 2) = 10
adjmatrix(2, 1) = 10

adjmatrix(1, 4) = 10
adjmatrix(4, 1) = 10

adjmatrix(1, 5) = 10
adjmatrix(5, 1) = 10

adjmatrix(1, 6) = 60
adjmatrix(6, 1) = 60

adjmatrix(2, 6) = 45
adjmatrix(6, 2) = 45

adjmatrix(3, 4) = 45
adjmatrix(4, 3) = 45

adjmatrix(4, 5) = 50
adjmatrix(5, 4) = 50

adjmatrix(5, 6) = 15
adjmatrix(6, 5) = 15

'边在图中的编号
Dim l As Integer, h As Integer
For l = 1 To vexnum
For h = 1 To vexnum
arc_pos(l, h) = 0
Next h
Next l
arc_pos(1, 2) = 1
arc_pos(2, 1) = 1

arc_pos(1, 4) = 2
arc_pos(4, 1) = 2

arc_pos(1, 5) = 3
arc_pos(5, 1) = 3
arc_pos(1, 6) = 4
arc_pos(6, 1) = 4

arc_pos(2, 6) = 5
arc_pos(6, 2) = 5

arc_pos(5, 6) = 6
arc_pos(6, 5) = 6

arc_pos(3, 4) = 7
arc_pos(4, 3) = 7

arc_pos(4, 5) = 8
arc_pos(5, 4) = 8


'求最短路径,将最短路径的长度放在数组D(max_vertex, max_vertex)中,路径放在数组P(max_vertex, max_vertex)中

Dim v As Integer
Dim w As Integer
For v = 1 To vexnum
For w = 1 To vexnum
D(v, w) = adjmatrix(v, w)
If v <> w And D(v, w) < Infinity Then
P(v, w) = v
Else
P(v, w) = 0
End If
Next w
Next v


Dim z As Integer, x As Integer, y As Integer
For z = 1 To vexnum
For x = 1 To vexnum
For y = 1 To vexnum
If D(x, z) + D(z, y) < D(x, y) Then
D(x, y) = D(x, z) + D(z, y)
P(x, y) = P(z, y)
End If
Next y
Next x
Next z
End Sub

Private Sub Command2_Click()

If Combo1.ListIndex = -1 Or Combo2.ListIndex = -1 Then '若用户没有请选择一个公交站点
MsgBox "请选择一个公交站点!"
Else
Dim m As Integer, n As Integer
m = Me.Combo1.ListIndex + 1
n = Me.Combo2.ListIndex + 1
Text1.Text = D(m, n)
End If


'高亮显示最短路径
Dim fs As Features
Dim lyr As Layer
Set lyr = Map1.Layers("边")
Set fs = lyr.AllFeatures
lyr.Selection.ClearSelection
If m <> n Then '若起点和终点一样(即m=n),则不要求高亮显示

If P(m, n) = m Then
lyr.Selection.Add fs(arc_pos(m, n)) '即站点m和站点n之间直接相连
Else
Do
lyr.Selection.Add fs(arc_pos(n, P(m, n))) '即站点m和站点n之间要通过站点p(m,n)
n = P(m, n)
Loop While P(m, n) <> m
lyr.Selection.Add fs(arc_pos(n, m)) '将起点m与其第一个通过的站点n相连
End If

End If

End Sub


上一个:[高分请教]vb读取文本的问题
下一个:VB的问题,来个知道的。。

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,