      PROGRAM DYNAMIC
      IMPLICIT INTEGER(A-Z)
      DOUBLE PRECISION TIMEA,TIMEB,TIMTOT,A(50,50),EPS
      REAL S1
      INTEGER X(50),Q(50),D(50,50),S(50)
C
C #################################################################
C  5/2005: Finds a maximum cardinality subset of objects with
C          perfect dominance structure.
C #################################################################
C
      OPEN(1,FILE='AMAT.DAT')          ! Dissimilarity matrix
      OPEN(2,FILE='SEQ.OUT')           ! Output file
      EPS = 1.0d-07
      READ(1,*) N                      ! Read number of objects
      READ(1,*) ((A(I,J),J=1,N),I=1,N)
      CALL GETTIM (IHR, IMIN, ISEC, I100)
      CALL GETDAT (IYR, IMON, IDAY)
      TIMEA=DFLOAT(86400*IDAY+3600*IHR+60*IMIN+ISEC)+DFLOAT(I100)/100.
      DO I = 1,N
        A(I,I) = 0.0D0
      END DO
C
      DO 848 I = 1,N-1
        DO 849 J = 1+I,N
          IF(A(I,J).GT.A(J,I)) THEN
            D(I,J) = 1
            D(J,I) = 0
          ELSEIF(A(I,J).LT.A(J,I)) THEN
            D(I,J) = 0
            D(J,I) = 1
          ELSE
            D(I,J) = 1      ! IN SOME SITUATIONS, IT MIGHT BE 
            D(J,I) = 1      ! BEST TO MAKE THESE ZEROS
          END IF
 849    CONTINUE
 848  CONTINUE
C
      Z = 0
      DO I = 1,N
        Q(I) = 0
      END DO
C
      M=1
      Q(M)=1
      S(1)=1
      DO K = 2,N
        Q(K)=0
      END DO
C
  1   M = M + 1
C
  2   Q(M)=Q(M)+1
C
      IF(S(Q(M)).EQ.1) GO TO 2               ! REDUNDANCY
      IF(M.EQ.1.AND.Q(M).GT.N) GO TO 9       ! TERMINATE
      IF(M.GT.1.AND.Q(M).GT.N) GO TO 7       ! GO TO RETRACTION
      S(Q(M))=1
      R3 = Q(M)
      DO I = 1,M-1
        R1 = Q(I)
        IF(D(R1,R3).EQ.0) THEN
          S(Q(M))=0
          GO TO 2
        END IF
      END DO
      IF(M.GT.Z) THEN
        Z = M
        DO I = 1,N
          X(I)=Q(I)
        END DO
      END IF
      GO TO 1
C
   7  S(Q(M))=0
      Q(M)=0
      M=M-1
      S(Q(M))=0
      GO TO 2
   9  CALL GETTIM (IHR, IMIN, ISEC, I100)
      CALL GETDAT (IYR, IMON, IDAY)
      TIMEB=DFLOAT(86400*IDAY+3600*IHR+60*IMIN+ISEC)+DFLOAT(I100)/100.
      TIMTOT=TIMEB-TIMEA
      WRITE(*,69) Z
      WRITE(2,69) Z
      WRITE(*,79) TIMTOT
      WRITE(2,79) TIMTOT
      WRITE(2,70) (X(I),I=1,N)
 69   FORMAT(' MAXIMUM SUBSET SIZE WITH PERFECT DOMINANCE ',I7)
 79   FORMAT(' CPU TIME ',F8.2)
 70   FORMAT(30I3)
C
      END
