52 lines
1.8 KiB
Plaintext
52 lines
1.8 KiB
Plaintext
100 O$ = "A" : T$ = "EF"
|
|
110 DEF FN N(P) = ASC(MID$(N$,P+(P=0),1))-64
|
|
120 DIM D(26),UNVISITED(26)
|
|
130 DIM PREVIOUS(26) : TRUE = 1
|
|
140 LET M = -1 : INFINITY = M
|
|
150 FOR I = 0 TO 26
|
|
160 LET D(I) = INFINITY : NEXT
|
|
170 FOR NE = M TO 1E38 STEP .5
|
|
180 READ C$
|
|
190 IF LEN(C$) THEN NEXT
|
|
200 DIM C(NE),FROM(NE),T(NE)
|
|
210 DIM PC(NE) : RESTORE
|
|
220 FOR I = 0 TO NE
|
|
230 READ C(I), N$
|
|
240 LET FROM(I) = FN N(1)
|
|
250 LET UNVISITED(FR(I)) = TRUE
|
|
260 LET T(I) = FN N(3)
|
|
270 LET UNVISITED(T(I)) = TRUE
|
|
290 NEXT
|
|
300 N$ = O$ : O = FN N(0)
|
|
310 D(O) = 0
|
|
320 FOR CV = O TO EMPTY STEP 0
|
|
330 FOR I = 0 TO NE
|
|
340 IF FROM(I) = CV THEN N = T(I) : D = D(CV) + C(I) : IF (D(N) = INFINITY) OR (D < D(N)) THEN D(N) = D : PREVIOUS(N) = CV : PC(N) = C(I)
|
|
350 NEXT I
|
|
360 LET UNVISITED(CV) = FALSE
|
|
370 LET MV = EMPTY
|
|
380 FOR I = 1 TO 26
|
|
390 IF UNVISITED(I) THEN MD = D(MV) * (MV <> INFINITY) + INFINITY * (MV = INFINITY) : IF (D(I) <> INFINITY) AND ((MD = INFINITY) OR (D(I) < MD)) THEN MV = I
|
|
400 NEXT I
|
|
410 LET CV = MV * (MD <> INF)
|
|
420 NEXT CV : M$ = CHR$(13)
|
|
430 PRINT "SHORTEST PATH";
|
|
440 FOR I = 1 TO LEN(T$)
|
|
450 LET N$ = MID$(T$, I, 1)
|
|
460 PRINT M$ " FROM " O$;
|
|
470 PRINT " TO "; : N = FN N(0)
|
|
480 IF D(N) = INFINITY THEN PRINT N$" DOES NOT EXIST.";
|
|
490 IF D(N) <> INFINITY THEN FOR N = N TO FALSE STEP 0 : PRINT CHR$(N + 64); : IF N < > O THEN PRINT " <- "; : N = PREVIOUS(N): NEXT N
|
|
500 IF D(N) <> INFINITY THEN PRINT : PRINT " IS "; : N = FN N(0) : PRINT D(N); : H = 15 : FOR N = N TO O STEP 0: IF N < > O THEN P = PREVIOUS(N): PRINT TAB(H)CHR$(43+18*(h=15));TAB(H+2)PC(N); :N = P: H=H+5: NEXT N
|
|
510 NEXT I
|
|
600 DATA 7,A-B
|
|
610 DATA 9,A-C
|
|
620 DATA 14,A-F
|
|
630 DATA 10,B-C
|
|
640 DATA 15,B-D
|
|
650 DATA 11,C-D
|
|
660 DATA 2,C-F
|
|
670 DATA 6,D-E
|
|
680 DATA 9,E-F
|
|
690 DATA
|