Cod sursa(job #1373974)

Utilizator mariusadamMarius Adam mariusadam Data 4 martie 2015 21:47:32
Problema Ciclu Eulerian Scor 0
Compilator fpc Status done
Runda Arhiva educationala Marime 1.74 kb
program euler;
var     g:array of array of longint;
        cd,sol:array[1..100000] of longint;
        m,n,nr,i,j: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 euler(x:longint);
var st,sf,i,nod,y,j:longint;
begin
 st:=1; sf:=1;
 cd[st]:=x;
 while st<=sf do
 begin
        nod:=cd[st];
        if g[nod,0]>0 then
        begin
                y:=g[nod,g[nod,0]];
                g[nod,0]:=g[nod,0]-1;
                sf:=sf+1;
                cd[sf]:=y;
                for i:=1 to g[y,0] do
                 if g[y,i]=nod then
                 begin
                        for j:=i to g[y,0]-1 do
                                g[y,j]:=g[y,j+1];
                        g[y,0]:=g[y,0]-1;
                        break;
                 end;
        end
        else
        begin
                nr:=nr+1;
                sol[nr]:=nod;
                st:=st+1;
        end;
 end;
end;

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