Cod sursa(job #1181412)

Utilizator azkabancont-vechi azkaban Data 2 mai 2014 18:02:58
Problema Ciclu Eulerian Scor 70
Compilator fpc Status done
Runda Arhiva educationala Marime 3.16 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,i,ok,key:longint;
    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;
    ok : byte;
begin
    if lda[nod]<>nil then begin
                               write(nod,' ');
                               key:=lda[nod]^.info;
                               lda[nod]:=lda[nod]^.pred;


                               v:=lda[key];
                               ok:=0;
           while ok=0 do
                      if lda[key]^.info=nod then begin
                                                    r:=lda[key];
                                                    lda[key]:=lda[key]^.pred;
                                                    dispose(r);
                                                    ok:=1;
                                                 end
                                            else
                      while v<>nil do begin
                                          if v^.info=nod then begin
                                                                 r^.pred:=v^.pred;
                                                                 dispose(v);
                                                                 ok:=1;
                                                              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); ok:=0;
    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');  //verif.conexitatea
                                          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.