Skip to content
Snippets Groups Projects
diamtr_sloan.f 4.8 KiB
Newer Older
  • Learn to ignore specific revisions
  • Douglas Guptill's avatar
    Douglas Guptill committed
          SUBROUTINE DIAMTR_SLOAN(N,E2,ADJ,XADJ,MASK,LS,XLS,HLEVEL,SNODE,NC)
    ************************************************************************
    *
    *     PURPOSE:
    *     --------
    *
    *     Find nodes which define a psuedo-diameter of a graph and store
    *     distances from end node
    *
    *     INPUT:
    *     ------
    *
    *     N      - The total number of nodes in the graph
    *     E2     - Twice the number of edges in the graph  = XADJ(N+1)-1
    *     ADJ    - Adjacency list for all nodes in the 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
    *            - Degree of node I given by XADJ(I+1)-XADJ(I)
    *     MASK   - Masking vector for graph
    *            - Visible nodes have MASK = 0, node invisible otherwise
    *     LS     - Undefined
    *     XLS    - Undefined
    *     HLEVEL - Undefined
    *     SNODE  - Undefined
    *     NC     - Undefined
    *
    *     OUTPUT:
    *     ------
    *
    *     N      - Unchanged
    *     E2     - Unchanged
    *     ADJ    - Unchanged
    *     XADJ   - Unchanged
    *     MASK   - List of distances of nodes from the end node
    *     LS     - List of nodes in the component
    *     XLS    - Not used
    *     HLEVEL - Not used
    *     SNODE  - Starting node for numbering
    *     NC     - The number of nodes in this component of graph
    *
    *     SUBROUTINES CALLED:  ROOTLS, ISORTI
    *     -------------------
    *
    *     NOTE:      SNODE and ENODE define a pseudo-diameter
    *     -----
    *
    *     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
          INTEGER NODE
          INTEGER DEPTH,ENODE,HSIZE,ISTOP,ISTRT,JSTOP,JSTRT,SNODE,WIDTH
          INTEGER DEGREE,EWIDTH,MINDEG,SDEPTH
          INTEGER LS(N)
          INTEGER ADJ(E2),XLS(N+1)
          INTEGER MASK(N),XADJ(N+1)
          INTEGER HLEVEL(N)
    *
    *     Choose first guess for starting node by min degree
    *     Ignore nodes that are invisible (MASK ne 0)
    *
          MINDEG=N
          DO 10 I=1,N
            IF(MASK(I).EQ.0)THEN
              DEGREE=XADJ(I+1)-XADJ(I)
              IF(DEGREE.LT.MINDEG)THEN
                SNODE=I
                MINDEG=DEGREE
              END IF
            END IF
       10 CONTINUE
    *
    *     Generate level structure for node with min degree
    *
          CALL ROOTLS_SLOAN
         &     (N,SNODE,N+1,E2,ADJ,XADJ,MASK,LS,XLS,SDEPTH,WIDTH)
    *
    *     Store number of nodes in this component
    *
          NC=XLS(SDEPTH+1)-1
    *
    *     Iterate to find start and end nodes
    *     
       15 CONTINUE
    *
    *     Store list of nodes that are at max distance from starting node
    *     Store their degrees in XLS
    *
          HSIZE=0
          ISTRT=XLS(SDEPTH)
          ISTOP=XLS(SDEPTH+1)-1
          DO 20 I=ISTRT,ISTOP
            NODE=LS(I)
            HSIZE=HSIZE+1
            HLEVEL(HSIZE)=NODE
            XLS(NODE)=XADJ(NODE+1)-XADJ(NODE)
       20 CONTINUE
    *
    *     Sort list of nodes in ascending sequence of their degree
    *     Use insertion sort algorithm
    *
          IF(HSIZE.GT.1)CALL ISORTI_SLOAN(HSIZE,HLEVEL,N,XLS)
    *
    *     Remove nodes with duplicate degrees
    *
          ISTOP=HSIZE
          HSIZE=1
          DEGREE=XLS(HLEVEL(1))
          DO 25 I=2,ISTOP
            NODE=HLEVEL(I)
            IF(XLS(NODE).NE.DEGREE)THEN
              DEGREE=XLS(NODE)
              HSIZE=HSIZE+1
              HLEVEL(HSIZE)=NODE
            ENDIF
       25 CONTINUE
    *
    *     Loop over nodes in shrunken level
    *
          EWIDTH=NC+1
          DO 30 I=1,HSIZE
            NODE=HLEVEL(I)
    *
    *       Form rooted level structures for each node in shrunken level
    *
            CALL ROOTLS_SLOAN
         &     (N,NODE,EWIDTH,E2,ADJ,XADJ,MASK,LS,XLS,DEPTH,WIDTH)
            IF(WIDTH.LT.EWIDTH)THEN
    *
    *         Level structure was not aborted during assembly
    *
              IF(DEPTH.GT.SDEPTH)THEN
    *
    *           Level structure of greater depth found
    *           Store new starting node, new max depth, and begin 
    *           a new iteration
    *
                SNODE=NODE
                SDEPTH=DEPTH
                GOTO 15
              ENDIF
    *
    *         Level structure width for this end node is smallest so far
    *         store end node and new min width
    *
              ENODE=NODE
              EWIDTH=WIDTH
            END IF
       30 CONTINUE
    *
    *     Generate level structure rooted at end node if necessary
    *
          IF(NODE.NE.ENODE)THEN
            CALL ROOTLS_SLOAN
         &     (N,ENODE,NC+1,E2,ADJ,XADJ,MASK,LS,XLS,DEPTH,WIDTH)
          ENDIF
    *
    *     Store distances of each node from end node
    *
          DO 50 I=1,DEPTH
            JSTRT=XLS(I)
            JSTOP=XLS(I+1)-1
            DO 40 J=JSTRT,JSTOP
              MASK(LS(J))=I-1
       40   CONTINUE
       50 CONTINUE
          END