64 lines
2.0 KiB
Plaintext
64 lines
2.0 KiB
Plaintext
100 NV=0: REM NUMBER OF VERTICES
|
|
110 READ N$:IF N$<>"" THEN NV=NV+1:GOTO 110
|
|
120 NE=0: REM NUMBER OF EDGES
|
|
130 READ N1:IF N1 >= 0 THEN READ N2,W:NE=NE+1:GOTO 130
|
|
140 DIM VN$(NV-1),VD(NV-1,2): REM VERTEX NAMES AND DATA
|
|
150 DIM ED(NE-1,2): REM EDGE DATA
|
|
160 RESTORE
|
|
170 FOR I=0 TO NV-1
|
|
180 : READ VN$(I): REM VERTEX NAME
|
|
190 : VD(I,0) = -1: REM DISTANCE = INFINITY
|
|
200 : VD(I,1) = 0: REM NOT YET VISITED
|
|
210 : VD(I,2) = -1: REM NO PREV VERTEX YET
|
|
220 NEXT I
|
|
230 READ N$: REM SKIP SENTINEL
|
|
240 FOR I=0 TO NE-1
|
|
250 : READ ED(I,0),ED(I,1),ED(I,2): REM EDGE FROM, TO, WEIGHT
|
|
260 NEXT I
|
|
270 READ N1: REM SKIP SENTINEL
|
|
280 READ O: REM ORIGIN VERTEX
|
|
290 :
|
|
300 REM BEGIN DIJKSTRA'S
|
|
310 VD(O,0) = 0: REM DISTANCE TO ORIGIN IS 0
|
|
320 CV = 0: REM CURRENT VERTEX IS ORIGIN
|
|
330 FOR I=0 TO NE-1
|
|
340 : IF ED(I,0)<>CV THEN 390: REM SKIP EDGES NOT FROM CURRENT
|
|
350 : N=ED(I,1): REM NEIGHBOR VERTEX
|
|
360 : D=VD(CV,0) + ED(I,2): REM TOTAL DISTANCE TO NEIGHBOR THROUGH THIS PATH
|
|
370 : REM IF PATH THRU CV < DISTANCE, UPDATE DISTANCE AND PREV VERTEX
|
|
380 : IF (VD(N,0)=-1) OR (D<VD(N,0)) THEN VD(N,0) = D:VD(N,2)=CV
|
|
390 NEXT I
|
|
400 VD(CV,1)=1: REM CURRENT VERTEX HAS BEEN VISITED
|
|
410 MV=-1: REM VERTEX WITH MINIMUM DISTANCE SEEN
|
|
420 FOR I=0 TO NV-1
|
|
430 : IF VD(I,1) THEN 470: REM SKIP VISITED VERTICES
|
|
440 : REM IF THIS IS THE SMALLEST DISTANCE SEEN, REMEMBER IT
|
|
450 : MD=-1:IF MV > -1 THEN MD=VD(MV,0)
|
|
460 : IF ( VD(I,0)<>-1 ) AND ( ( MD=-1 ) OR ( VD(I,0)<MD ) ) THEN MV=I
|
|
470 NEXT I
|
|
480 IF MD=-1 THEN 510: REM END IF ALL VERTICES VISITED OR AT INFINITY
|
|
490 CV=MV
|
|
500 GOTO 330
|
|
510 PRINT "SHORTEST PATH TO EACH VERTEX FROM "VN$(O)":";CHR$(13)
|
|
520 FOR I=0 TO NV-1
|
|
530 : IF I=0 THEN 600
|
|
540 : PRINT VN$(I)":"VD(I,0)"(";
|
|
550 : IF VD(I,0)=-1 THEN 600
|
|
560 : N=I
|
|
570 : PRINT VN$(N);
|
|
580 : IF N<>O THEN PRINT "←";:N=VD(N,2):GOTO 570
|
|
590 : PRINT ")"
|
|
600 NEXT I
|
|
610 DATA A,B,C,D,E,F,""
|
|
620 DATA 0,1,7
|
|
630 DATA 0,2,9
|
|
640 DATA 0,5,14
|
|
650 DATA 1,2,10
|
|
660 DATA 1,3,15
|
|
670 DATA 2,3,11
|
|
680 DATA 2,5,2
|
|
690 DATA 3,4,6
|
|
700 DATA 4,5,9
|
|
710 DATA -1
|
|
720 DATA 0
|