Cod sursa(job #1181328)

Utilizator azkabancont-vechi azkaban Data 2 mai 2014 15:20:41
Problema Ciclu Eulerian Scor 50
Compilator fpc Status done
Runda Arhiva educationala Marime 3.12 kb
type lista=^celula;
       celula=record
         info:longint;
         pred:lista;
       end;

var lda:array[1..100005] of lista;
    gr,viz : array [1..100005] of longint;
    a,b,n,m,k,i,sol,ok,nr:longint;
    r,v : lista;

procedure add(v:longint; var p:lista);
   var r:lista;
    begin
         new(r);
         r^.info:=v;
         r^.pred:=p;
         p:=r;
    end;

procedure euler(nod : longint);
var r,v : lista;
    key : longint;
begin
    nr:=nr+1;
    if nr<=m then write(nod,' ');
    if lda[nod]<>nil then begin
                              key:=lda[nod]^.info;
                              r:=lda[nod];
                              lda[nod]:=lda[nod]^.pred;
                              dispose(r);
                              v:=lda[key];
                              r:=lda[key];
                              if v^.info=nod then begin
                                          r:=v;
                                          lda[key]:=lda[key]^.pred;
                                          dispose(v);
                                          end
                                          else
                              while v<>nil do begin
                                   if v^.info=nod then begin
                                                            r^.pred:=v^.pred;
                                                            dispose(v);
                                                            break;
                                                       end;
                                                            r:=v;
                                                            v:=v^.pred;
                                                       end;
                              euler(key);
                             end;

end;

procedure dfs(nod:longint);
    var r:lista;
    begin
           viz[nod]:=1;
           r:=lda[nod];
           while r<>nil do begin
                                 if viz[r^.info]=0 then dfs(r^.info);
                                 r:=r^.pred;
                           end;
    end;

begin
    assign(input,'ciclueuler.in'); reset(input);
    assign(output,'ciclueuler.out'); rewrite(output);
    readln(n,m);
    for i:=1 to m do begin
                          readln(a,b);
                          add(b,lda[a]);
                          gr[b]:=gr[b]+1;
                          add(a,lda[b]);
                          gr[a]:=gr[a]+1;
                     end;
   dfs(1);
   for i:=1 to n do
                   if viz[i]=0 then begin
                                          writeln('-1');
                                          ok:=1;
                                          break;
                                      end;
  if  ok=0 then
   for i:=1 to n do if (gr[i] mod 2)=1 then begin
                                         writeln('-1');
                                               ok:=1;
                                               break;
                                              end;
   if ok=0 then euler(1);


   close(input);
   close(output);
end.