File: MSTREE.PS of Tape: Various/Decus/decus-3
(Source file text)
PROGRAM MINIMALSPANNINGTREE(INPUT,OUTPUT); CONST NMAX=100; BMAX=99 (* BMAX=NMAX-1 *); INF=99E99 (* LARGE VALUE OF TYPE LENGTH *); ZER=0.0 (* ZERO VALUE OF TYPE LENGTH *); TYPE INDEX=INTEGER (* 0..NMAX *); LENGTH=REAL (* RESULTTYPE OF FUNCTION 'DIST' *); VAR N,H,K,I,LCR,SUV: INDEX; X,Y: ARRAY[1..NMAX] OF REAL; (* POINT I DESCRIBED BY X[I],Y[I] *) FROM,INTO: ARRAY[1..BMAX] OF INDEX; (* BRANCH K DESCRIBED BY FROM[K],INTO[K] *) UVL: ARRAY[1..BMAX] OF LENGTH; (* UVL[K] CONTAINS LENGTH OF BRANCH K *) MIN,LEN,SUM,L: LENGTH; FUNCTION DIST(P,Q: INDEX): LENGTH; BEGIN DIST := SQRT( SQR(X[P]-X[Q]) + SQR(Y[P]-Y[Q]) ) END; BEGIN READ(N); WRITELN("THE",N:5," GIVEN POINTS ARE:"); FOR K := 1 TO N DO BEGIN READ(X[K],Y[K]); WRITELN(K:3," (",X[K]:10:2,",",Y[K]:10:2,")":3) END; WRITELN; FOR K := 1 TO N-1 DO BEGIN FROM[K] := 0; INTO[K] := K; UVL[K] := INF END; LCR := N; FOR K := 1 TO N-1 DO BEGIN SUV := 0; MIN := INF; FOR H := K TO N-1 DO BEGIN LEN := DIST(LCR,INTO[H]); IF LEN<UVL[H] THEN BEGIN UVL[H] := LEN; FROM[H] := LCR END ELSE LEN := UVL[H]; IF LEN<MIN THEN BEGIN MIN := LEN; SUV := H END END; I := FROM[K]; FROM[K] := FROM[SUV]; FROM[SUV] := I; I := INTO[K]; INTO[K] := INTO[SUV]; INTO[SUV] := I; L := UVL[K]; UVL[K] := UVL[SUV]; UVL[SUV] := L; LCR := INTO[K] END; WRITELN("THE MINIMAL SPANNING TREE IS:"); SUM := ZER; FOR K := 1 TO N-1 DO BEGIN SUM := SUM + UVL[K]; WRITELN(FROM[K]:5,"-":5,INTO[K]:5,UVL[K]:12:2) END; WRITELN(" ":15,"------------"); WRITELN("TOTAL LENGTH: ",SUM:12:2) END.