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 (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|