OSPF.frm
上传用户:shenlian
上传日期:2022-08-01
资源大小:15k
文件大小:6k
源码类别:

数据结构

开发平台:

Visual C++

  1. VERSION 5.00
  2. Begin VB.Form frmOSPF 
  3.    Caption         =   "最短路径选择"
  4.    ClientHeight    =   4650
  5.    ClientLeft      =   3360
  6.    ClientTop       =   2910
  7.    ClientWidth     =   7170
  8.    Icon            =   "OSPF.frx":0000
  9.    LinkTopic       =   "Form2"
  10.    LockControls    =   -1  'True
  11.    ScaleHeight     =   4650
  12.    ScaleWidth      =   7170
  13.    Begin VB.TextBox Text1 
  14.       Height          =   3375
  15.       Left            =   240
  16.       MultiLine       =   -1  'True
  17.       ScrollBars      =   2  'Vertical
  18.       TabIndex        =   5
  19.       Top             =   1080
  20.       Width           =   6735
  21.    End
  22.    Begin VB.CommandButton Command1 
  23.       Caption         =   "打印最短路线"
  24.       Height          =   495
  25.       Left            =   4320
  26.       TabIndex        =   4
  27.       Top             =   360
  28.       Width           =   2055
  29.    End
  30.    Begin VB.ComboBox Combo2 
  31.       Height          =   300
  32.       Left            =   1680
  33.       TabIndex        =   2
  34.       Text            =   "终点站"
  35.       Top             =   600
  36.       Width           =   1215
  37.    End
  38.    Begin VB.ComboBox Combo1 
  39.       Height          =   300
  40.       Left            =   240
  41.       TabIndex        =   1
  42.       Text            =   "起讫站"
  43.       Top             =   600
  44.       Width           =   1215
  45.    End
  46.    Begin VB.Label Label2 
  47.       AutoSize        =   -1  'True
  48.       Caption         =   "终点站:"
  49.       Height          =   180
  50.       Left            =   1800
  51.       TabIndex        =   3
  52.       Top             =   240
  53.       Width           =   720
  54.    End
  55.    Begin VB.Label Label1 
  56.       AutoSize        =   -1  'True
  57.       Caption         =   "起讫站:"
  58.       Height          =   180
  59.       Left            =   240
  60.       TabIndex        =   0
  61.       Top             =   240
  62.       Width           =   720
  63.    End
  64. End
  65. Attribute VB_Name = "frmOSPF"
  66. Attribute VB_GlobalNameSpace = False
  67. Attribute VB_Creatable = False
  68. Attribute VB_PredeclaredId = True
  69. Attribute VB_Exposed = False
  70. Option Explicit
  71. Dim start, ends As Long
  72. Dim JLH(1 To 300), LJD(1 To 300, 1 To 4), DST(1 To 300, 1 To 4) As Long
  73. Dim BH(1 To 300), ADD(1 To 300) As String
  74. Dim n As Integer
  75. Dim vertexnum As Integer
  76. Dim edgenum As Integer
  77. Const max = 100000
  78. Dim graph(0 To 300, 0 To 300) As Long
  79. Dim visited(0 To 300) As Integer
  80. Dim path(0 To 300) As Integer
  81. Dim distance(0 To 90000) As Long
  82. Private Function dijkstra(begin As Integer)
  83.     Dim minedge, vertex, i, j, n, m, edges As Integer
  84.     edges = 1
  85.     visited(begin) = 1
  86.     For i = 1 To vertexnum
  87.         distance(i) = graph(begin, i)
  88. '        Debug.Print distance(i)
  89.     Next i
  90.         distance(begin) = 0
  91.               While (edges < vertexnum - 1)
  92.                 edges = edges + 1
  93.                 minedge = max
  94.                 For j = 1 To vertexnum
  95.                     If visited(j) = 0 And minedge > distance(j) Then
  96.                         vertex = j
  97.                         minedge = distance(j)
  98.                     End If
  99.                 Next j
  100.                 visited(vertex) = 1
  101.                 For n = 1 To vertexnum
  102.                     If visited(n) = 0 And (distance(vertex) + graph(vertex, n)) < distance(n) Then
  103.                         distance(n) = distance(vertex) + graph(vertex, n)
  104.                         path(n) = vertex
  105.                     End If
  106.                 Next
  107.               Wend
  108. End Function
  109. Private Sub Command1_Click()
  110.     Dim i, j As Integer
  111.     Dim k As Integer
  112.     Dim addname(1 To 100) As String
  113.     
  114.     Text1 = ""
  115.         If start = 0 Or ends = 0 Then
  116.         MsgBox "请选择起始站与终点站"
  117.         Exit Sub
  118.     End If
  119.     For i = 1 To vertexnum
  120.         visited(i) = 0
  121.         path(i) = 1
  122.     Next
  123.     dijkstra (start)
  124.     Text1 = "起讫站:" & ADD(start) & "  -->  " & "终点站:" & ADD(ends) & vbCrLf
  125.     Text1 = Text1 & vbCrLf
  126.     If distance(ends) = max Then
  127.         Text1 = Text1 & "两站点间没有可联接的路线!"
  128.         Exit Sub
  129.     Else
  130.         Text1 = Text1 & "它们之间的距离为: " & distance(ends) * 0.1 & "  Km" & vbCrLf
  131.         Text1 = Text1 & vbCrLf
  132.         Text1 = Text1 & "它们之间的最短路线为:" & vbCrLf
  133.         Text1 = Text1 & vbCrLf
  134.         Text1 = Text1 & ADD(start)
  135.     End If
  136.     k = ends
  137.     j = 1
  138.     Do
  139.         addname(j) = ADD(k)
  140.         k = path(k)
  141.         j = j + 1
  142.     Loop While (k <> 1)
  143.     For j = j - 1 To 1 Step -1
  144.         Text1 = Text1 & "--> " & addname(j)
  145.     Next j
  146. End Sub
  147. Private Sub Form_Initialize()
  148.     Dim i, j, k As Long
  149.     Dim filename As String
  150.     Dim buffers As String
  151.     
  152.     On Error Resume Next
  153.     
  154.     filename = App.path + "" + "Add_Dst" + ".txt"
  155.     Open filename For Input As #1
  156.     If LOF(1) = 0 Then
  157.         MsgBox "The lenth of the file is zero! Please Select it asgain。" & vbCrLf & "The file name is Add_Dst。"
  158.         
  159.         Exit Sub
  160.     End If
  161.     i = 1
  162.     Do While Not EOF(1)
  163.     Line Input #1, buffers
  164.         BH(i) = Val(Mid$(buffers, 1, 3))
  165.         ADD(i) = Mid$(buffers, 4, 4)
  166.             Combo1.AddItem ADD(i)
  167.             Combo2.AddItem ADD(i)
  168.         LJD(i, 1) = Val(Mid$(buffers, 8, 3))    '邻接点的编号
  169.         DST(i, 1) = Val(Mid$(buffers, 11, 2))    '与邻接点之间的距离
  170.         LJD(i, 2) = Val(Mid$(buffers, 13, 3))
  171.         DST(i, 2) = Val(Mid$(buffers, 16, 2))
  172.         LJD(i, 3) = Val(Mid$(buffers, 18, 3))
  173.         DST(i, 3) = Val(Mid$(buffers, 21, 2))
  174.         LJD(i, 4) = Val(Mid$(buffers, 24, 3))
  175.         DST(i, 4) = Val(Mid$(buffers, 27, 2))
  176.         Kill buffers
  177.         i = i + 1
  178.     Loop
  179.         n = i - 1
  180. '       Debug.Print n
  181.     Close #1
  182.        
  183.     vertexnum = n  '设置图的顶点数
  184.     
  185.     edgenum = 0
  186.    
  187.     For i = 1 To n
  188.         For j = 1 To 4
  189.             If LJD(i, j) = 0 Then Exit For
  190.             edgenum = edgenum + 1    '获得图的边数
  191.             graph(i, LJD(i, j)) = DST(i, j)   '从i点与其邻接点LJD(i,j)的距离
  192.         Next
  193.     Next
  194.     For i = 0 To n
  195.         For j = 0 To n
  196.             If graph(i, j) = 0 Then
  197.                 graph(i, j) = max
  198.             End If
  199.         Next
  200.     Next
  201. End Sub
  202. Private Sub Combo1_click()
  203.     start = Combo1.ListIndex + 1      '获得起讫站的编号
  204. End Sub
  205. Private Sub Combo2_click()
  206.     ends = Combo2.ListIndex + 1      '获得终点站的编号
  207. End Sub