深さ優先グラフ探索

 投稿者:しばっち  投稿日:2021年12月12日(日)09時57分19秒
  深さ優先の再帰呼び出しによるグラフ探索です。


PUBLIC NUMERIC A(20,20),DISTANCE(20),VISITED(20),INDEX(100),SIZE,INF,TRUE,FALSE,START
PUBLIC NUMERIC MININDEX(100),MINDISTANCE,MAXINDEX(100),MAXDISTANCE
PUBLIC STRING NODE$(26)
MAT READ NODE$
DATA A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z
LET INF=100000000
LET MINDISTANCE=INF
LET MAXDISTANCE=-INF
LET TRUE=1
LET FALSE=0
RESTORE 10
READ SIZE
FOR I=1 TO SIZE ! 隣接行列読み込み
   FOR J=1 TO SIZE
      READ S$
      IF S$="INF" THEN
         LET A(I,J)=INF
      ELSE
         LET A(I,J)=VAL(S$)
      END IF
   NEXT J
NEXT I
LET START=8
LET GOAL=2
IF START<1 OR GOAL<1 OR START>SIZE OR GOAL>SIZE OR START=GOAL THEN
   PRINT "ERROR !!"
   STOP
END IF
CALL VISIT(START,GOAL)
PRINT REPEAT$("-",60)
LET K=START
DO
   PRINT NODE$(K);" → ";
   LET K=MININDEX(K)
LOOP UNTIL K=GOAL
PRINT NODE$(GOAL);"  MIN DISTANCE";MINDISTANCE
!LET K=START
!DO
!   PRINT NODE$(K);" → ";
!   LET K=MAXINDEX(K)
!LOOP UNTIL K=GOAL
!PRINT NODE$(GOAL);"  MAX DISTANCE";MAXDISTANCE

10 DATA 10 ! 有向グラフ
   DATA INF,  1,  4,INF,  5,INF,  2,INF,  2,INF
   DATA INF,INF,  3,INF,INF,  4,INF,INF,INF,INF
   DATA   3,INF,INF,  2,INF,INF,  1,INF,INF,  1
   DATA INF,INF,  2,INF,INF,INF,INF,  3,INF,INF
   DATA INF,  2,INF,INF,INF,  2,INF,INF,INF,  1
   DATA   1,INF,  4,INF,  1,INF,  5,INF,INF,INF
   DATA INF,  3,INF,INF,INF,  6,INF,  5,INF,INF
   DATA   1,INF,INF,  3,INF,INF,INF,INF,  5,INF
   DATA INF,  2,INF,  5,INF,  2,INF,  3,INF,  2
   DATA   1,INF,  4,  3,INF,INF,  5,INF,INF,INF

20 DATA 8 ! 無向グラフ(対角成分に対して対称。A(I,J)とA(J,I)が同値)
   DATA INF,  1,  1,INF,INF,INF,  1,  1
   DATA   1,INF,  1,INF,  1,INF,INF,INF
   DATA   1,  1,INF,  1,INF,  1,  1,INF
   DATA INF,INF,  1,INF,  1,INF,  1,  1
   DATA INF,  1,INF,  1,INF,  1,INF,INF
   DATA INF,INF,  1,INF,  1,INF,  1,INF
   DATA   1,INF,  1,  1,INF,  1,INF,  1
   DATA   1,INF,INF,  1,INF,INF,  1,INF

30 DATA 10 ! 有向グラフ
   DATA INF,  2,INF,  1,INF,  4,  6,INF,  7,INF
   DATA INF,INF,INF, -2,  1,INF,INF,  2,INF,  1
   DATA  -3,INF,INF,INF,  1,INF, -1,INF,  2,INF
   DATA INF,  2,INF,INF,INF,INF,  1,INF,INF,  3
   DATA INF,INF, -1,INF,INF,  2,INF,  3,  4,INF
   DATA   4,INF,INF,INF,  2,INF,INF,  1,INF,  5
   DATA INF,  1,INF,  2,INF,  1,INF,  5,INF,INF
   DATA   2,INF,INF,  4,INF,  3,INF,INF,  2,  4
   DATA INF,INF,  4,INF,  4,INF, -2,INF,INF,INF
   DATA   1,INF,  3,INF,  6,INF,  1,INF,INF,INF
END

EXTERNAL  SUB VISIT(I,GOAL)
   IF I=GOAL THEN
      LET K=START
      DO
         PRINT NODE$(K);" → ";
         LET K=INDEX(K)
      LOOP UNTIL K=GOAL
      PRINT NODE$(GOAL);"  DISTANCE";DISTANCE(GOAL)
      IF MINDISTANCE>DISTANCE(GOAL) THEN
         MAT MININDEX=INDEX
         LET MINDISTANCE=DISTANCE(GOAL)
      END IF
      !      IF MAXDISTANCE<DISTANCE(GOAL) THEN
      !         MAT MAXINDEX=INDEX
      !         LET MAXDISTANCE=DISTANCE(GOAL)
      !      END IF
   ELSE
   !IF MINDISTANCE>DISTANCE(I) THEN
      FOR J=1 TO SIZE
         IF I<>J AND A(I,J)<>INF AND VISITED(J)=FALSE THEN
            LET VISITED(I)=TRUE
            LET DISTANCE(J)=DISTANCE(I)+A(I,J)
            LET INDEX(I)=J
            CALL VISIT(J,GOAL)
            LET VISITED(I)=FALSE
            LET INDEX(I)=0
            LET DISTANCE(J)=0
         END IF
      NEXT J
      !END IF
   END IF
END SUB
 

戻る