77 lines
3.2 KiB
Plaintext
77 lines
3.2 KiB
Plaintext
* Floyd-Warshall algorithm - 06/06/2018
|
|
FLOYDWAR CSECT
|
|
USING FLOYDWAR,R13 base register
|
|
B 72(R15) skip savearea
|
|
DC 17F'0' savearea
|
|
SAVE (14,12) save previous context
|
|
ST R13,4(R15) link backward
|
|
ST R15,8(R13) link forward
|
|
LR R13,R15 set addressability
|
|
MVC A+8,=F'-2' a(1,3)=-2
|
|
MVC A+VV*4,=F'4' a(2,1)= 4
|
|
MVC A+VV*4+8,=F'3' a(2,3)= 3
|
|
MVC A+VV*8+12,=F'2' a(3,4)= 2
|
|
MVC A+VV*12+4,=F'-1' a(4,2)=-1
|
|
LA R8,1 k=1
|
|
DO WHILE=(C,R8,LE,V) do k=1 to v
|
|
LA R10,A @a
|
|
LA R6,1 i=1
|
|
DO WHILE=(C,R6,LE,V) do i=1 to v
|
|
LA R7,1 j=1
|
|
DO WHILE=(C,R7,LE,V) do j=1 to v
|
|
LR R1,R6 i
|
|
BCTR R1,0
|
|
MH R1,=AL2(VV)
|
|
AR R1,R8 k
|
|
SLA R1,2
|
|
L R9,A-4(R1) a(i,k)
|
|
LR R1,R8 k
|
|
BCTR R1,0
|
|
MH R1,=AL2(VV)
|
|
AR R1,R7 j
|
|
SLA R1,2
|
|
L R3,A-4(R1) a(k,j)
|
|
AR R9,R3 w=a(i,k)+a(k,j)
|
|
L R2,0(R10) a(i,j)
|
|
IF CR,R2,GT,R9 THEN if a(i,j)>w then
|
|
ST R9,0(R10) a(i,j)=w
|
|
ENDIF , endif
|
|
LA R10,4(R10) next @a
|
|
LA R7,1(R7) j++
|
|
ENDDO , enddo j
|
|
LA R6,1(R6) i++
|
|
ENDDO , enddo i
|
|
LA R8,1(R8) k++
|
|
ENDDO , enddo k
|
|
LA R10,A @a
|
|
LA R6,1 f=1
|
|
DO WHILE=(C,R6,LE,V) do f=1 to v
|
|
LA R7,1 t=1
|
|
DO WHILE=(C,R7,LE,V) do t=1 to v
|
|
IF CR,R6,NE,R7 THEN if f^=t then do
|
|
LR R1,R6 f
|
|
XDECO R1,XDEC edit f
|
|
MVC PG+0(4),XDEC+8 output f
|
|
LR R1,R7 t
|
|
XDECO R1,XDEC edit t
|
|
MVC PG+8(4),XDEC+8 output t
|
|
L R2,0(R10) a(f,t)
|
|
XDECO R2,XDEC edit a(f,t)
|
|
MVC PG+12(4),XDEC+8 output a(f,t)
|
|
XPRNT PG,L'PG print
|
|
ENDIF , endif
|
|
LA R10,4(R10) next @a
|
|
LA R7,1(R7) t++
|
|
ENDDO , enddo t
|
|
LA R6,1(R6) f++
|
|
ENDDO , enddo f
|
|
L R13,4(0,R13) restore previous savearea pointer
|
|
RETURN (14,12),RC=0 restore registers from calling sav
|
|
VV EQU 4
|
|
V DC A(VV)
|
|
A DC (VV*VV)F'99999999' a(vv,vv)
|
|
PG DC CL80' . -> . .'
|
|
XDEC DS CL12
|
|
YREGS
|
|
END FLOYDWAR
|