ダイクストラ法

 投稿者:しばっち  投稿日:2021年12月12日(日)09時58分39秒
  https://ja.wikipedia.org/wiki/ダイクストラ法

ダイクストラ法によるグラフ探索です。
このプログラムは移植版です。


DIM 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
RESTORE 10
READ SIZE
DIM VISITED(SIZE),DISTANCE(SIZE),INDEX(SIZE),A(SIZE,SIZE)
LET TRUE=1
LET FALSE=0
LET INF=100000000
MAT DISTANCE=(INF)*CON
FOR I=1 TO SIZE
   FOR J=1 TO SIZE
      READ S$
      IF S$<>"INF" THEN LET A(I,J)=VAL(S$) ELSE LET A(I,J)=INF
   NEXT J
NEXT I
LET START=3
LET DISTANCE(START)=0
LET NEXTINDEX=START
DO
   LET I=NEXTINDEX
   LET VISITED(I)=TRUE
   LET LMIN=INF
   FOR J=1 TO SIZE
      IF VISITED(J)=FALSE THEN
         IF A(I,J)<>INF AND DISTANCE(J)>DISTANCE(I)+A(I,J) THEN
            LET DISTANCE(J)=DISTANCE(I)+A(I,J)
            LET INDEX(J)=I
         END IF
         IF DISTANCE(J)<LMIN THEN
            LET LMIN=DISTANCE(J)
            LET NEXTINDEX=J
         END IF
      END IF
   NEXT J
LOOP WHILE LMIN<INF
FOR I=1 TO SIZE
   IF I<>START AND VISITED(I)=TRUE THEN
      LET K=I
      PRINT NODE$(K);
      DO
         LET K=INDEX(K)
         PRINT " ← ";NODE$(K);
      LOOP UNTIL K=START
      PRINT "  DISTANCE";DISTANCE(I)
   END IF
NEXT I

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

40 DATA 7
   DATA INF,  1,INF,  3,INF,  5,INF
   DATA   2,INF,  3,INF,INF,INF,  2
   DATA INF,  2,INF,  2,  4,INF,INF
   DATA INF,INF,  4,INF,INF,INF,  5
   DATA   3,INF,  3,  3,INF,  2,INF
   DATA INF,  1,INF,  4,  2,INF,INF
   DATA   5,INF,  2,INF,  3,  6,INF
END
 

戻る