{ Pocita reflexivni, symetricky a transitivni uzaver } { relace, jejiz seznam dvojic vstupuje ze souboru Data } { jsou pripustne pouze prvky z intervalu 0..M, kde M<= MMAX =255 } { Toto omezeni je proto, ze program pracuje s mnozinami } { Soubor Data obsahuje vzdy na radce dvojici vstupujici relace } { vstup je ukoncen zapornym cislem na novem radku } program ekviv; const MMAX = 255; M = 32; { omezeni prvku mnoziny , musi byt <=MMAX } F = 3; { format vystupu cisla } PL = 20; { 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 } AktNUM : class; { cisla, ktera se objevila na vstupu } AktClass : class; { indexy aktivnich trid } A,B,TB : prvek; I,J,K,L : integer; Data, Vyst : text; procedure Pridej(X:prvek); begin if X>M then begin writeln(Vyst,'Chybna hodnota ',X:5); halt; end else if not (X in AktNUM) then begin AktNUM := AktNUM+[X]; AktClass := AktClass+[X]; end; end; begin {inicializace } assign(Data,'D1.TXT'); assign(Vyst,'V1.TXT'); reset(Data); rewrite(Vyst); AktNUM := []; {zadna cisla nevstoupila} AktClass := []; {a tedy nejsou ani zadne tridy ekvivalence} 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(Data,A); repeat readln(Data,B); {druhy prvek dvojice} pridej(A); pridej(B); 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} AktClass := AktClass - [TB]; for I:=0 to M do if T[I]=TB then T[I]:=T[A]; end; read(Data,A); {prvni clen nove dvojice} until A<0; {vystup:} for I:= 0 to M do begin if I in AktClass then {trida s indexem I je aktivni} begin writeln(Vyst,'Trida:'); L:=0; { L je pocitadlo prvku tridy na radce } for J:=0 to M do if J in C[I] then begin write(Vyst,J:F); L:=L+1; if L=PL then begin {nova radka} L:=0; writeln(Vyst); end; end end; if L>0 then writeln(Vyst); end; end.