Cod sursa(job #1628994)

Utilizator DoubleNyNinicu Cristian DoubleNy Data 4 martie 2016 12:02:07
Problema Ciclu Eulerian Scor 0
Compilator fpc Status done
Runda Arhiva educationala Marime 3.7 kb
type
     edge=record
      x,y:longint;
     end;
var
   edges:array[1..50010] of edge;
   adiacenta:array[1..10001,1..10001] of longint;
   degree,lista:array[1..10001] of longint;
   i,j,m,n,noduri,muchii,neigh,u,k,grade:longint;
   Queue,Visited,st:array[1..100001] of 0..100001;

function next(x:longint):longint;
var i,j:longint;
begin
     for i:=1 to muchii do
     if edges[i].x=x then
     begin
          next:=edges[i].y;
          exit;
     end;

     for i:=1 to muchii do
     if edges[i].y=x then
     begin
          next:=edges[i].x;
          exit;
     end;


end;

procedure erase(a,b:longint);
var i,j:longint;
begin
     for i:=1 to muchii do
     if (edges[i].x=a) and (edges[i].y=b) then
     begin
          edges[i].x:=0;
          edges[i].y:=0;
          break;
     end;
     for j:=i to muchii do
     begin
          edges[j].x:=edges[j+1].x;
          edges[j].y:=edges[j+1].y;
     end;
     dec(muchii);
     fillchar(degree,sizeof(degree),0);
     for i:=1 to noduri do
    begin
        for j:=1 to muchii do
        if (edges[j].x=i) or (edges[j].y=i) then inc(degree[i]);
    end;
end;
procedure push(n:longint);

begin
    lista[k]:=n;
    inc(k);
end;

procedure push_st(nod:longint);
begin
    inc(u);
    st[u]:=nod;
end;

procedure pop;
begin
   st[u]:=0;
   dec(u);
end;

//Cautare ciclu eulerian
procedure Euler(nod:longint);
var w,neigh:longint;
begin
    push_st(nod);
    while u>0 do
    begin
        nod:=st[u];
        if degree[nod]=0 then
        begin
           push(nod);
           pop;
        end
         else
         begin
              neigh:=next(nod);
              erase(nod,neigh);
              push_st(neigh);
         end;
    end;

end;
{

procedure Euler(nod:longint);
begin
    while (degree[nod]>0) do
    begin
        neigh:=next(nod);
        erase(nod,neigh);
        euler(neigh);
    end;
    push(nod);
end;
      }
//Parcurgere in adancime
function dfs(n:longint):boolean;
var i,p,u,v:longint;
   // Queue,Visited:array[1..10001] of longint;
begin
     fillchar(Visited,sizeof(Visited),0);
     p:=1;
     u:=1;
     queue[1]:=1; visited[1]:=1;
     while p<=u do
     begin
          v:=queue[p]; inc(p);
          for i:=1 to n do
          if (adiacenta[v,i]=1) and (visited[i]=0) then
          begin
             inc(u);
             queue[u]:=i;
             visited[i]:=1;
          end;

     end;
     dfs:=true;
     for i:=1 to n do
     if visited[i]=0 then dfs:=not(dfs);
end;

{procedure dfs(nod:longint);
var k:longint;
begin
    //write(nod);
    visited[nod]:=1;
    for k:=1 to noduri do
    if (adiacenta[nod,k]=1) and (visited[k]=0) then
    dfs(k);
end; }



BEGIN
    assign(input,'ciclueuler.in'); reset(input);
    assign(output,'ciclueuler.out'); rewrite(output);
    readln(input,noduri,muchii);
    for i:=1 to muchii do
    readln(input,edges[i].x,edges[i].y);
    fillchar(adiacenta,sizeof(adiacenta),0);
    for i:=1 to muchii do
    adiacenta[edges[i].x,edges[i].y]:=1;
    fillchar(degree,sizeof(degree),0);
    u:=0; k:=1;
    fillchar(lista,sizeof(lista),0);
    for i:=1 to noduri do
    begin
        for j:=1 to muchii do
        if (edges[j].x=i) or (edges[j].y=i) then
        begin
           if edges[j].x<>edges[j].y then
           inc(degree[i]);
        end;
    end;
    for i:=1 to noduri do if odd(degree[i]) then
    begin
       write(output,'-1');
       exit;
    end;

    if not(dfs(1)) then
    begin
         write(output,'-1');
         exit;
    end;

    Euler(1);
    for i:=k-1 downto 2 do write(output,lista[i],' ');
    close(input);
    close(output);
END.