Cod sursa(job #1181335)

Utilizator azkabancont-vechi azkaban Data 2 mai 2014 15:52:42
Problema Ciclu Eulerian Scor 70
Compilator fpc Status done
Runda Arhiva educationala Marime 3.04 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,key:longint;
    r,v : lista;
    b1,b2 : array [0..1 shl 17] of char;

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;
begin
    if lda[nod]<>nil then begin
                              write(nod,' ');
                              key:=lda[nod]^.info;
                              lda[nod]:=lda[nod]^.pred;

                              v:=lda[key];
                              r:=lda[key];

                          if lda[key]<>nil then
                             if lda[key]^.info=nod then begin
                                                   lda[key]:=lda[key]^.pred;
                                                        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'); settextbuf(input,b1); reset(input);
    assign(output,'ciclueuler.out'); settextbuf(output,b2); 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.