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