Cod sursa(job #1373304)

Utilizator mariusadamMarius Adam mariusadam Data 4 martie 2015 17:57:02
Problema Ciclu Eulerian Scor 40
Compilator fpc Status done
Runda Arhiva educationala Marime 1.91 kb
program euler;
var     g:array of array of longint;
        sol:array[1..100000] of longint;
        bufin,bufout:array[1..65535] of byte;
        m,n,nr,i,j,k:longint;
        fi,fo:text;

procedure citire;
var i,j,k:longint;
begin
 readln(fi,n,m);
 setlength(g,n+1,1);
 for k:=1 to m do
 begin
        readln(fi,i,j);
        g[i,0]:=g[i,0]+1;
        setlength(g[i],g[i,0]+1);
        g[i,g[i,0]]:=j;
        g[j,0]:=g[j,0]+1;
        setlength(g[j],g[j,0]+1);
        g[j,g[j,0]]:=i;
 end;
end;

function eulerian:boolean;
var     i:longint;
        ok:boolean;
begin
 ok:=true;
 for i:=1 to n do
        if g[i,0] mod 2<>0 then
        begin
                ok:=false;
                break;
        end;
 eulerian:=ok;
end;

procedure sterge(x,y:longint);
var i:longint;
begin
 for i:=1 to g[x,0] do
        if g[x,i]=y then
        begin
                g[x,i]:=0;
                break;
        end;
 for i:=1 to g[y,0] do
        if g[y,i]=x then
        begin
                g[y,i]:=0;
                break;
        end;
end;

procedure euler(x:longint);
begin
 for k:=1 to g[sol[x],0] do
        if k<=g[sol[x],0] then
        if g[sol[x],k]>0 then
        begin
                nr:=nr+1;
                for j:=nr downto x+1 do
                        sol[j]:=sol[j-1];
                sol[x+1]:=g[sol[x],k];
                sterge(sol[x],g[sol[x],k]);
                x:=x+1;
                euler(x);
        end;
end;

begin
 assign(fi,'ciclueuler.in'); reset(fi);
 assign(fo,'ciclueuler.out'); rewrite(fo);
 settextbuf(fi,bufin);
 settextbuf(fo,bufout);
 citire;
 if not eulerian then
        writeln(fo,-1)
 else
 begin
        i:=1;sol[1]:=1;
        while sol[i]<>0 do
        begin
                euler(i);
                i:=i+1;
        end;
        for i:=1 to nr do
                write(fo,sol[i],' ');
 end;
 close(fi);
 close(fo);
end.