      20
       5       2       4       3       5       6
               8       8       8       9      14
       6      10       7       6       1      14      15
               9       9      10       8      14      14
       4       6       1      11       8
               8       8       8      10
       4       7      12       1       9
               9       8       8       9
       5       1       9       8      13      18
               9       9       8       9      14
       3      14       2       3
               9      10       8
       3      16       2       4
               8       9       9
       2       3       5
              10       8
       5       4       5      18       1      12
               9       9       9      14      14
       3      15      14       2
               8       8       9
       2       3      19
               8      20
       2       4       7
               8      14
       2       5      17
               9       9
       4      10      19       6       2
               8      10       9      14
       2      10       2
               8      14
       1       7
               8
       2      13      20
               9       8
       2       9       5
               9      14
       2      14      11
              10      20
       1      17
               8
   1
   1
   2
   3
   4
   5
   6
   7
   8
   9
  10
  11
  12
  13
  14
  15
  16
  17
  18
  19
  20
   0
   3
  20
  15
  10
   5
   6
   9
   0
  11
   2
   0
  20
  16
   8
   4
   2
   1
   0
   0
      INTEGER FLIST(200),DFLIST(200),KF(51),MJ(50),WJ(50),W(50),H(50),  PAP00001
     +        IN,INPUT,OUTP,TEMP(10)                                    PAP00002
C                                                                       PAP00003
C     THIS PROGRAM CALCULATES THE SHORTEST PATH LENGTHS FROM A SPECIFIC PAP00004
C     NODE (J0) TO ALL OTHER NODES IN A NETWORK  AND THE SHORTEST PATHS PAP00005
C     BETWEEN THIS NODE (J0) AND OTHER NODES (KE).                      PAP00006
C                                                                       PAP00007
C     FLIST(NUMBER OF EDGES)                                            PAP00008
C     DFLIST(NUMBER OF EDGES)                                           PAP00009
C     KF(NUMBER OF NODES+1)                                             PAP00010
C                                                                       PAP00011
C     FLIST, DFLIST, AND KF REPRESENT THE NETWORK                       PAP00012
C                                                                       PAP00013
C     MJ(NUMBER OF NODES)                                               PAP00014
C     WJ(NUMBER OF NODES)                                               PAP00015
C     W(NUMBER OF NODES)                                                PAP00016
C     H(NUMBER OF NODES)                                                PAP00017
C                                                                       PAP00018
      DATA INF,IN,INPUT,OUTP /1000000,4,5,6/                            PAP00019
C                                                                       PAP00020
C     IN           CHANNEL FOR INPUT J0                                 PAP00021
C     INPUT        CHANNEL FOR INPUT NETWORK                            PAP00022
C     OUTP         CHANNEL FOR OUTPUT                                   PAP00023
C                                                                       PAP00024
C     INPUT OF THE NUMBER OF NODES N                                    PAP00025
C                                                                       PAP00026
    1 READ(INPUT,100) N                                                 PAP00027
      K=0                                                               PAP00028
      KF(1)=0                                                           PAP00029
C                                                                       PAP00030
C     INPUT OF THE NETWORK                                              PAP00031
C                                                                       PAP00032
      DO 4 I=1,N                                                        PAP00033
      READ(INPUT,100) IT,(TEMP(J),J=1,IT)                               PAP00034
      IF (IT.EQ.0) GO TO 3                                              PAP00035
      JA=K+1                                                            PAP00036
      JB=K+IT                                                           PAP00037
      JJ=1                                                              PAP00038
      DO 2 J=JA,JB                                                      PAP00039
      FLIST(J)=TEMP(JJ)                                                 PAP00040
    2 JJ=JJ+1                                                           PAP00041
C                                                                       PAP00042
      READ(INPUT,100) IDUMMY,(DFLIST(J),J=JA,JB)                        PAP00043
      K=K+IT                                                            PAP00044
    3 KF(I+1)=K                                                         PAP00045
    4 CONTINUE                                                          PAP00046
C                                                                       PAP00047
C     INPUT OF START NODE J0                                            PAP00048
C                                                                       PAP00049
    5 READ(IN,101) J0                                                   PAP00050
      IF (J0.LE.0) STOP                                                 PAP00051
C                                                                       PAP00052
      CALL SHPTHL(FLIST,DFLIST,KF,N,MJ,J0,WJ)                           PAP00053
C                                                                       PAP00054
      WRITE(OUTP,200) J0                                                PAP00055
      IF (N.GT.0) WRITE(OUTP,201) (I,MJ(I),I=1,N)                       PAP00056
C                                                                       PAP00057
C     INPUT OF END NODE KE                                              PAP00058
C                                                                       PAP00059
    6 READ(IN,101) KE                                                   PAP00060
      IF (KE.LE.0) GO TO 5                                              PAP00061
C                                                                       PAP00062
      CALL SHPATH(J0,KE,WJ,H,NI,W)                                      PAP00063
C                                                                       PAP00064
      WRITE(OUTP,202) J0,KE,MJ(KE)                                      PAP00065
      WRITE(OUTP,203) (W(I),I=1,NI)                                     PAP00066
      GO TO 6                                                           PAP00067
C                                                                       PAP00068
100   FORMAT(10I8)                                                      PAP00069
101   FORMAT(I4)                                                        PAP00070
200   FORMAT(21H1DISTANCES FROM NODE ,I5/)                              PAP00071
201   FORMAT(10(I7,1H-,I4))                                             PAP00072
202   FORMAT(//15H PATH FROM NODE,I7,9H TO NODE ,I7,13H (PATHLENGTH=,   PAP00073
     +       I7,1H))                                                    PAP00074
203   FORMAT(1H ,20I6)                                                  PAP00075
      END                                                               PAP00076
      SUBROUTINE SHPTHL(FLIST,DFLIST,KF,N,MJ,J0,WJ)                     SPL00001
      INTEGER FLIST(200),DFLIST(200),KF(51),MJ(50),NJ(50),WJ(50)
      DATA INF /1000000/
C
C     SHPTHL CALCULATES THE SHORTEST PATH LENGTHS (MJ) FROM A SPECIFIC
C     NODE (J0) TO ALL OTHER (N-1) NODES IN A NETWORK (FLIST,DFLIST,KF).
C     PREDECESSOR NODES ARE STORED IN WJ.
C
C     FLIST : FORWARD INDEX LIST
C     DFLIST: DISTANCE LIST
C     KF    : POINTER LIST FOR FLIST AND DFLIST
C     N     : NUMBER OF NODES
C     MJ    : ARRAY OF SHORTEST PATH LENGTHS
C     JO    : INITIAL NODE, FIRST NODE OF SHORTEST PATH
C     WJ    : ARRAY OF PREDECESSORS FOR SHORTEST PATH CONSTRUCTION
C     NJ    : DOUBLE ENDED QUEUE FOR NODE DISCUSSION
C     INF   : A LARGE NUMBER
C
C     INITIAL VALUES OF
C     FLIST,DFLIST,KF: NETWORK FROM INPUT AND MAIN PROGRAM
C     N              : NUMBER OF NODES FROM INPUT AND MAIN PROGRAM
C     J0             : START NODE FROM INPUT AND MAIN PROGRAM
C
      DO 1 I=1,N
      MJ(I)=INF
    1 NJ(I)=0
      MJ(J0)=0
C
C     I     : INDEX FOR NODE DISCUSSION, NODE UNDER DISCUSSION
C     NT    : POINTER TO THE END OF DEQUE NJ
C     MJI   : LOCAL VARIABLE OF MJ(I)
C     KFI   : LOCAL VARIABLE OF KF(I)
C     KFI1  : LOCAL VARIABLE OF KF(I)+1
C     IR    : INDEX FOR ARRAY DISCUSSION
C     K     : SUCCESSOR OF NODE I
C     MJK   : LOCAL VARIABLE OF MJ(K)
C     NJI   : LOCAL VARIABLE OF NJ(I), THE NEXT NODE OF NJ TO BE TAKEN
C             UNDER DISCUSSION
C
      NJ(J0)=INF
      I=J0
      NT=J0
C
C     OUTER LOOP
C     DISCUSSION OF NODES I
C
    2 KFI=KF(I+1)
      MJI=MJ(I)
      KFI1=KF(I)+1
C
C     INNER  LOOP
C     DISCUSSION OF SUCCESSORS K
C
      IF (KFI1.GT.KFI) GO TO 6
      DO 5 IR=KFI1,KFI
      K=FLIST(IR)
      MJK=MJI+DFLIST(IR)
C     NO DECREASE OF SHORTEST DISTANCES
      IF (MJK.GE.MJ(K)) GO TO 5
C     DECREASE OF SHORTEST DISTANCES
      MJ(K)=MJK
C     PREDECESSOR I OF NODE K
      WJ(K)=I
C     NODE K ALREADY IN THE DEQUE NJ ?
      IF (NJ(K))  4,3,5
C     NODE K ADDED AT THE END OF THE DEQUE NJ
    3 NJ(NT)=K
      NT=K
      NJ(K)=INF
      GO TO 5
C     NODE K ADDED AT THE BEGINNING OF THE DEQUE NJ
    4 NJ(K)=NJ(I)
      NJ(I)=K
      IF (NT.EQ.I) NT = K
    5 CONTINUE
C     NODE I TAKEN FROM THE BEGINNING OF THE DEQUE NJ
    6 NJI=NJ(I)
      NJ(I)=-NJI
      I=NJI
      IF (I.LT.INF) GOTO 2
      RETURN
      END
      SUBROUTINE SHPATH(J0,KE,WJ,H,NI,W)                                PAT00001
      INTEGER WJ(50),H(50),W(50)
C
C     SHPATH CALCULATES THE SHORTEST PATH BETWEEN THE TWO NODES J0 AND
C     KE. SHPATH USES THE INFORMATION IN WJ, THE LIST OF PREDECESSOR
C     NODES. THE NODES OF THE SHORTEST PATH ARE STORED IN W.
C
C     J0    : FIRST NODE OF THE SHORTEST PATH
C     KE    : LAST NODE OF THE SHORTEST PATH
C     WJ    : ARRAY OF PREDECESSORS FOR SHORTEST PATH CONSTRUCTION
C     H     : AUXILIARY ARRAY FOR THE SHORTEST PATH
C     NI    : NUMBER OF NODES OF THE SHORTEST PATH
C     W     : THE SHORTEST PATH
C
C     I,J   : LOCAL VARIABLE FOR NODE DISCUSSION
C
C     INITIAL VALUES OF
C     J0    : FIRST NODE FROM INPUT OR MAIN PROGRAM
C     KE    : LAST NODE FROM INPUT OR MAIN PROGRAM
C     WJ    : FROM SUBROUTINE SHPTHL
C
      H(1)=KE
      I=1
      J=KE
      IF (J0.EQ.KE) GO TO 2
C
    1 I=I+1
      J=WJ(J)
      H(I)=J
      IF (J.NE.J0) GO TO 1
C
    2 NI=I
C
      DO 3 I=1,NI
    3 W(I)=H(NI+1-I)
C
      RETURN
      END
