Cod sursa(job #270852)

Utilizator 05_YohnE1 La5c01 05_Yohn Data 4 martie 2009 17:44:54
Problema Ciclu Eulerian Scor 50
Compilator fpc Status done
Runda Arhiva educationala Marime 1.85 kb
{graf eulerian -> toate muchiile sunt vizitate o singura data}
{TEOREMA:
Un graf e eulerian daca e conex si d[i]=par oricare ar fi i din X}
type pnod=^nod;
     nod=record
          info:longint;
          urm:pnod;
     end;

var v:array[1..100001]of pnod;
    gr,sol,c:array[1..100001]of integer;
    i,a,b,m,n,vf:longint;
    f,g:text;
function eulerian:boolean;
var i:longint;
begin
eulerian:=true;
for i:=1 to n do
    if (gr[i] mod 2=1)or(gr[i]=0)then begin
       eulerian:=false;
       break;end;
end;

procedure adaug(var p:pnod;x:longint);
var q:pnod;
begin
new(q);
q^.info:=x;
if p=nil then begin
              q^.urm:=nil;
              p:=q;
              end
         else begin
         q^.urm:=p;
         p:=q;
         end;
end;

procedure elimin(x,y:longint);
var q,qq:pnod;
begin
q:=v[x];
v[x]:=v[x]^.urm;
dispose(q);
if v[y]^.info=x then begin
   q:=v[y];
   v[y]:=v[y]^.urm;
   dispose(q);
   end
   else begin
        q:=v[y];
        while q^.urm^.info<>x do q:=q^.urm;
        qq:=q^.urm;
        q^.urm:=qq^.urm;
        dispose(qq);
        end;
end;


begin
assign(f,'ciclueuler.in');reset(f);
assign(g,'ciclueuler.out');rewrite(g);
read(f,n,m);
for i:=1 to m do begin
    read(f,a,b);
    adaug(v[a],b);
    adaug(v[b],a);
    inc(gr[a]);inc(gr[b]);
end;

if not eulerian then write(g,'-1')
   else begin
        vf:=1;b:=0;
        c[vf]:=1;
        while vf<>0 do begin
              a:=c[vf];
              if v[a]<>nil then begin
                 inc(vf);
                 c[vf]:=v[a]^.info;
                 elimin(a,v[a]^.info);
              end
              else begin
                   inc(b);
                   sol[b]:=c[vf];
                   dec(vf);
                   end;
        end;
        for i:=1 to b-1 do write(g,sol[i],' ');
   end;
close(g);
end.