Cod sursa(job #2711843)

Utilizator nolokDragomir Andrei Theodor Paul nolok Data 24 februarie 2021 19:17:08
Problema Parcurgere DFS - componente conexe Scor 0
Compilator fpc Status done
Runda Arhiva educationala Marime 3.16 kb
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