PublicFunctionshortpath(startnoAsInteger,endnoAsInteger)AsSingle
以开始点,结束点为参数。
Dimresult()AsSingle
Dimresult1AsInteger
定义结果点
Dims1AsSingle
DimminAsSingle
Dimii,i,j,aaAsInteger
Dimyc()AsBoolean
Dimycd()AsBoolean
Dimrs1()AsSingle
Dimno()AsInteger
DimnopointAsInteger
ReDimyc(1Tomaxno)AsBoolean
ReDimycd(1Tomaxno)AsBoolean
ReDimrs1(1Tomaxno)AsSingle
ReDimresult(1To2,1Tomaxno)AsSingle
定义结果,其中result(1,maxno)为结果点,result(2,maxno)为结果长度。
Fori=1Tomaxno//maxno为网中最大的节点数。
yc(i)=False//标记已经查过的点。
ycd(i)=False//标记已经作结果点用过的点
rs1(i)=1E+38//假设从起点到任一点的距离都为无穷大
Nexti
ll=startno//设置开始点。
yc(ll)=True//标记开始点为真。即已经作结果点用过。
j=0
Foraa=1Tomaxno
先从与开始点相连的终点寻找
Fori=1Toindexa1(2,ll)//以与ll点相连的起点的个数循环
result1=b1(indexa1(1,ll)-i+1)找出与LL点相连的终点的点号
s1=c1(indexa1(1,ll)-i+1)+result(2,ll)找出长度并求和
Ifyc(result1)=TrueThenGoTo200如果以被经查过进行下一个
Ifycd(result1)=TrueThen//如果已经作为结果点判断哪一个长
Ifrs1(result1)>=s1Then//如果这一点到起点的长度比现在的路线长,替代
rs1(result1)=s1
result(1,result1)=ll//设置到这点的最短路径的前一点为LL点(精华部分)
result(2,result1)=s1设置到这点的最短路径长度
GoTo200
Else
GoTo200
EndIf
EndIf
如果上面的条件都不符合则进行下面的语句
ycd(result1)=True
rs1(result1)=s1
result(1,result1)=ll
result(2,result1)=s1
每找到一个点加一,为了下面的判断
j=j+1
ReDimPreserveno(1Toj)AsInteger
从新定义数组并使其值为当前的点号
no(j)=result1
200NextI
再从与开始点相连的终点寻找,与上面一样不再标注
Fori=1Toindexb2(2,ll)
result1=a2(indexb2(1,ll)-i+1)
s1=c2(indexb2(1,ll)
Ifyc(result1)=TrueThenGoTo300
Ifycd(result1)=TrueThen
Ifrs1(result1)>=s1Then
rs1(result1)=s1
result(1,result1)=s1
GoTo300
Else
GoTo300
EndIf
EndIf
ycd(result1)=True
rs1(result1)=s1
result(1,result1)=s1
j=j+1
ReDimPreserveno(1Toj)AsInteger
no(j)=result1
300NextI
设置最小为无穷大,最短路径点为空min=1E+38minpoint=Null(优化部分)找出已经查过点中长度最短的点Fori=aaTojIfmin>rs1(no(i))Thenii=imin=rs1(no(i))minpoint=no(i)EndIfNextI如果没有结果,即起点与终点没有通路退出程序Ifmin=1E+38ThenExitFunction(重点优化)将两点互换,减少循环。no(ii)=no(aa)no(aa)=minpoint标记已经作为结果点判断过yc(minpoint)=Truell=minpoint判断结果点是否等于终点,如果等于则已经找到最短路径Ifminpoint=endnoThenExitForNextaa返回最短路径长度Stpath=result(2,endno)EndFunction