Cod sursa(job #411270)

Utilizator nickyyLal Daniel Emanuel nickyy Data 4 martie 2010 20:02:22
Problema Ciclu Eulerian Scor 100
Compilator fpc Status done
Runda Arhiva educationala Marime 1.4 kb
const infile='ciclueuler.in';
  outfile='ciclueuler.out';
  maxn=100003;
  maxm=500003;
type adresa=^pnod;
  pnod=record  nod:longint; next:adresa; end;
var g:array[1..maxn]of adresa;
  gr:array[1..maxn]of longint;
  S:array[1..maxm]of longint;
  n,m,nr:longint;

 procedure citire;
 var i,j,k:longint;
   r:adresa;
 begin
   assign(input,infile); reset(input); readln(n,m);
   for k:=1 to m do begin
     readln(i,j);
     new(r); r^.nod:=j; r^.next:=g[i]; g[i]:=r;
     new(r); r^.nod:=i; r^.next:=g[j]; g[j]:=r;
     inc(gr[i]); inc(gr[j]);
     end;
   close(output);
 end;

 function verifica:boolean;
 var i:longint;
 begin
   i:=1; while(i<=n)and((gr[i] mod 2<>1)and(gr[i]<>0))do inc(i);
   if(i>n)then verifica:=true
   else verifica:=false;
 end;

 procedure solve;
 var u,v:longint;
   r,p:adresa;
 begin
   nr:=1; S[nr]:=1;
   while(nr>0)do begin
     u:=S[nr];
     if(g[u]<>nil)then begin
       inc(nr); v:=g[u]^.nod; S[nr]:=v;
       r:=g[u]; g[u]:=r^.next; dispose(r);
       r:=g[v]; p:=nil;
       while(r^.nod<>u)do begin p:=r; r:=r^.next; end;
       if(p=nil)then begin g[v]:=r^.next; dispose(r); end
       else begin p^.next:=r^.next; dispose(r); end;
       end
     else begin write(S[nr],' '); dec(nr); end;
     end;
 end;

begin
 citire;
 assign(output,outfile); rewrite(output);
 if not verifica then write(-1)
 else solve;
 close(output);
end.