PROGRAM ParcurgereDfs;
USES Fgl;
{$COperators On}
TYPE
TMuchie = Array [1..2] Of DWord;
TLista = specialize TFPGList<DWord>;
VAR
// Val
Nrn, Nrm, NrViz, NrConex: DWord;
Graf: Array Of TMuchie;
Viz: TLista;
I, J, K: DWord;
// Fisier
Fin, Fout: TextFile;
FUNCTION Min(A, B: DWord): DWord; inline;
begin
Result := (A + B - Abs(A - B)) shr 1; // Nu are semn
end;
FUNCTION Max(A, B: DWord): DWord; inline;
begin
Result := (A + B + Abs(A - B)) shr 1; // Nu are semn
end;
BEGIN
// Citire
Assign(Fin, 'dfs.in');
Reset(Fin);
Readln(Fin, Nrn, Nrm);
SetLength(Graf, Nrm);
for I := 0 to Nrm - 1 do begin
Readln(Fin, J, K);
Graf[i, 1] := Min(J, K);
Graf[i, 2] := Max(J, K);
end;
Close(Fin);
Viz := TLista.Create;
//Writeln(Graf[i, 1], ' ', Graf[i, 2]);
// Vizitare noduri
NrConex := 0;
NrViz := 0;
while false and (NrViz <= Nrn) do begin WRITELN('NrViz <= Nrn, ', NrViz, ' <= ', Nrn);
if Length(Graf) <= 0 then begin {Noduri izolate} //WRITELN('Lng(Graf) <= 0, ', Length(Graf), ' <= 0');
NrConex += Nrn - NrViz; //WRITELN('');
NrViz := Nrn + 1;
end else if Viz.Count <= 0 then begin {Subgraf nou}
NrConex += 1;
Viz.Add(Graf[0, 1]);
end else begin {Nodurile anterioare}
// Nodurile alaturate lui Viz[0], din muchiile lui Graf
I := 0; //WRITELN('I := 0'); WRITELN('while I in Graf, ...', I,'/', High(Graf));
while I <= High(Graf) do begin //WRITELN(' if Graf[i,1]=Viz[0], ...I=', I); WRITELN(' and IndexOf Graf[i,2] < 0, ...G[', I, ',2]', Graf[i, 2]);
if (Graf[i, 1] = Viz[0]) and {Inceputul muchiei este primul vizitat}
(Viz.IndexOf(Graf[i, 2]) < 0) then begin {Capatul nu e vizitat}
Viz.Add(Graf[i, 2]); //WRITELN(' Viz.Add Graf[i,2], ...G[', I, ',2]=', Graf[i, 2]);
// Scapa de muchia marcata si nodul vechi vizitat
Delete(Graf, i, 1); //WRITELN(' Delete Graf[i], ...G[', I, ']={', Graf[i,1], ';', Graf[i,2], '}');
Viz.Delete(0); //WRITELN(' Viz.Delete #0');
NrViz += 1; //WRITELN(' NrViz ++');
I -= 1; //WRITELN(' I --');
end; //WRITELN(' end;');
I += 1; //WRITELN(' I ++');
end; //WRITELN('end;'); READLN;
end;
end;
;
Viz.Free;
// Scriere rezultat
Assign(Fout, 'dfs.out');
Rewrite(Fout);
Write(Fout, NrConex+3); ;;; Write(NrConex);
Close(Fout);
//Readln;
//Exit;
END.
// EOF