{ Pocita reflexivni, symetricky a transitivni uzaver } { relace nad mnozinou cisel 0..M, kde M<= MMAX =255 } { Toto omezeni je proto, ze program pracuje s mnozinami } { Vstupuje vycet dvojic relace R0 v textovem souboru DATA } { vzdy dvojice na radku, ukonceny zapornym cislem } { Automaticky se doplni vsechny dvojice (x,x) pro x=0..M } program ekviv; const MMAX = 255; M = 32; { omezeni prvku mnoziny , musi byt <=MMAX } F = 3; { format vystupu cisla } PL = 10; { pocet cisel na radce } type prvek = 0..M; class = set of prvek; var C : array [prvek] of class; T : array [prvek] of prvek; { C[T[I]] je trida prvku ekvivalentnich s prvkem I } Aktiv : class; { indexy aktivnich trid } A,B,TB : prvek; I,J,L : integer; begin {inicializace } Aktiv := [0..M]; for I:=0 to M do begin { kazdy prvek I je ekvivalentni sam se sebou } T[I]:=I; C[I]:=[I]; end; {cteni dat a sekvencni vypocet trid ekvivalence} read(A); repeat readln(B); {druhy prvek dvojice} if T[A]<>T[B] then begin {prvky A a B dosud nebyly ekvivalentni} {sjednoceni trid:} C[T[A]] := C[T[A]]+C[T[B]]; {aktualizace mapovaci pole T} TB := T[B]; {trida s indexem TB jiz neni aktivni} Aktiv := Aktiv - [TB]; for I:=0 to M do if T[I]=TB then T[I]:=T[A]; end; read(A); {prvni clen nove dvojice} until A<0; {vystup:} for I:= 0 to M do begin if I in Aktiv then {trida s indexem I je aktivni} begin writeln('Trida:'); L:=0; { L je pocitadlo prvku na radce } for J:=0 to M do if J in C[I] then begin write(J:F); L:=L+1; if L=PL then begin {nova radka} L:=0; writeln; end; end; if L>0 then writeln end; end; end.