SUBROUTINE NUMBER_SLOAN(N,NC,SNODE,LSTNUM,E2,ADJ,XADJ,S,Q,P)
************************************************************************
*
*     PURPOSE:
*     --------
*
*     Number nodes in component of graph for small profile and rms
*     wavefront
*
*     INPUT:
*     ------
*
*     N      - Number of nodes in graph
*     NC     - Number of nodes in component of graph
*     SNODE  - Node at which numbering starts
*     LSTNUM - Count of nodes which have already been numbered
*     E2     - Twice tne number of edges in the graph = XADJ(N+1)-1
*     ADJ    - Adjacency list for all nodes in graph
*            - List of length 2E where E is the number of edges in
*              the graph and 2E = XADJ(N+1)-1
*     XADJ   - Index vector for ADJ
*            - Nodes adjacent to node I are found in ADJ(J), where
*              J = XADJ(I), XADJ(I)+1, ..... , XADJ(I+1)-1
*     S      - List giving the distance of each node in this
*              component from the end node
*     Q      - List of nodes which are in this component
*            - Also used to store queue of active or preactive nodes
*     P      - Undefined
*
*     OUTPUT:
*     -------
*
*     N      - Unchanged
*     NC     - Unchanged
*     SNODE  - Unchanged
*     LSTNUM - Count of numbered nodes (input value incremented by NC)
*     E2     - Unchanged
*     ADJ    - Unchanged
*     XADJ   - Unchanged
*     S      - List of new node numbers 
*            - New number for node I is S(I)
*     Q      - Not used
*     P      - Not used
*
*     NOTES:
*     ------
*
*     S also serves as a list giving the status of the nodes
*     during the numbering process:
*     S(I) gt 0 indicates node I is postactive
*     S(I) =  0 indicates node I is active 
*     S(I) = -1 indicates node I is preactive
*     S(I) = -2 indicates node I is inactive
*     P is used to hold the priorities for each node
*
*     PROGRAMMER:             Scott Sloan
*     -----------
*
*     LAST MODIFIED:          1 March 1991    Scott Sloan
*     --------------
*
*     COPYRIGHT 1989:         Scott Sloan
*     ---------------         Department of Civil Engineering
*                             University of Newcastle
*                             NSW 2308
*
************************************************************************
      INTEGER I,J,N
      INTEGER E2,NC,NN,W1,W2
      INTEGER NBR
      INTEGER NEXT,NODE,PRTY
      INTEGER JSTOP,JSTRT,ISTOP,ISTRT,NABOR,SNODE
      INTEGER ADDRES,LSTNUM,MAXPRT
      INTEGER P(N),Q(NC),S(N)
      INTEGER ADJ(E2)
      INTEGER XADJ(N+1)
*
      PARAMETER (W1=1, W2=2)
*
*     Initialise priorities and status for each node in this component
*     Initial priority = W1*DIST - W2*DEGREE     where:
*     W1     = a positive weight
*     W2     = a positive weight
*     DEGREE = initial current degree for node
*     DIST   = distance of node from end node
*
      DO 10 I=1,NC
        NODE=Q(I)
        P(NODE)=W1*S(NODE)-W2*(XADJ(NODE+1)-XADJ(NODE)+1)
        S(NODE)=-2
   10 CONTINUE
*
*     Insert starting node in queue and assign it a preactive status
*     NN is the size of queue
*
      NN=1
      Q(NN)=SNODE
      S(SNODE)=-1
*
*     Loop while queue is not empty
*
   30 IF(NN.GT.0)THEN
*
*       Scan queue for node with max priority
*
        ADDRES=1
        MAXPRT=P(Q(1))
        DO 35 I=2,NN
          PRTY=P(Q(I))
          IF(PRTY.GT.MAXPRT)THEN
            ADDRES=I
            MAXPRT=PRTY
          END IF
   35   CONTINUE
*
*       NEXT is the node to be numbered next
*
        NEXT=Q(ADDRES)
*
*       Delete node NEXT from queue
*       
        Q(ADDRES)=Q(NN)
        NN=NN-1
        ISTRT=XADJ(NEXT)
        ISTOP=XADJ(NEXT+1)-1
        IF(S(NEXT).EQ.-1)THEN
*
*         Node NEXT is preactive, examine its neighbours
*
          DO 50 I=ISTRT,ISTOP
*
*           Decrease current degree of neighbour by -1
*
            NBR=ADJ(I)
            P(NBR)=P(NBR)+W2
*
*           Add neighbour to queue if it is inactive
*           assign it a preactive status
*
            IF(S(NBR).EQ.-2)THEN
              NN=NN+1
              Q(NN)=NBR
              S(NBR)=-1
            END IF
   50     CONTINUE
        END IF
*
*       Store new node number for node NEXT
*       Status for node NEXT is now postactive
*
        LSTNUM=LSTNUM+1
        S(NEXT)=LSTNUM
*
*       Search for preactive neighbours of node NEXT
*
        DO 80 I=ISTRT,ISTOP
          NBR=ADJ(I)
          IF(S(NBR).EQ.-1)THEN
*
*           Decrease current degree of preactive neighbour by -1
*           assign neighbour an active status
*
            P(NBR)=P(NBR)+W2
            S(NBR)=0
*
*           Loop over nodes adjacent to preactive neighbour
*
            JSTRT=XADJ(NBR)
            JSTOP=XADJ(NBR+1)-1
            DO 60 J=JSTRT,JSTOP
              NABOR=ADJ(J)
*
*             Decrease current degree of adjacent node by -1
*
              P(NABOR)=P(NABOR)+W2
              IF(S(NABOR).EQ.-2)THEN
*
*               Insert inactive node in queue with a preactive status
*
                NN=NN+1
                Q(NN)=NABOR
                S(NABOR)=-1
               END IF
   60       CONTINUE
          END IF
   80   CONTINUE
        GOTO 30
      END IF
      END