Cod sursa(job #713895)

Utilizator amaliutzzaGoia Amalia amaliutzza Data 15 martie 2012 08:54:39
Problema Ciclu Eulerian Scor 20
Compilator fpc Status done
Runda Arhiva educationala Marime 2.13 kb
program ciclueuler;

type pnod=^nod;
     nod=record inf,nro:integer; urm:pnod; end;
     muchie=record ns,nd,cate:integer; end;

var fi,fo:Text;
    bufin,bufout:array[1..1 shl 17]of char;
    m,n,ind,i,nrm,unde:integer;
    l:array[1..100000]of pnod;
    trecut:array[1..100000]of 0..1;
    sol:array[1..100000]of integer;
    muchii:array[1..100000]of muchie;

    procedure push_back(nod,vecin,muchie:integer);
    var p:pnod;
    begin
        new(p); p^.inf:=vecin; p^.nro:=muchie; p^.urm:=l[nod]; l[nod]:=p;
    end;

    function cauta(x,y:integer):integer;
    var i:integer;
    begin
        cauta:=0;
        for i:=1 to nrm do
          with muchii[i] do
            if ((ns=x) and (nd=y)) or
               ((nd=x) and (ns=y)) then
                 begin
                     cauta:=i;
                     exit;
                 end;
    end;

  procedure citire;
  var i,x,y:integer;
  begin
      readln(fi,n,m);
      for i:=1 to m do
        begin
            readln(fi,x,y);
            unde:=cauta(x,y);
            if unde=0 then
              begin
                  inc(nrm);
                  muchii[nrm].ns:=x; muchii[nrm].nd:=y; inc(muchii[nrm].cate);
              end
            else
              begin
                  inc(muchii[unde].cate);
              end;
            push_back(x,y,i);
            push_back(y,x,i);
        end;
  end;

  procedure euler(nod:integer);
  var p:pnod;
  begin
      trecut[nod]:=1;
      p:=l[nod];
      while p<>nil do
        begin
          unde:=cauta(nod,p^.inf);
            if muchii[unde].cate>0 then
              begin
                  dec(muchii[unde].cate);
                  euler(p^.inf);
              end;
            p:=p^.urm;
        end;
      inc(ind);
      sol[ind]:=nod;
  end;

begin
    assign(fi,'ciclueuler.in'); reset(fi); settextbuf(fi,bufin);
    assign(fo,'ciclueuler.out'); rewrite(fo); settextbuf(fo,bufout);

      citire;

      for i:=1 to n do
        if trecut[i]=0 then
          euler(i);

      for i:=1 to ind-1 do
        write(fo,sol[i],' ');

    close(fi); close(fo);
end.