Cod sursa(job #272104)

Utilizator philipPhilip philip Data 6 martie 2009 13:24:24
Problema Ciclu Eulerian Scor 10
Compilator fpc Status done
Runda Arhiva educationala Marime 2.66 kb
type pnod=^nod;
     nod=record
       inf:longint;
       adr:pnod;
       v:boolean;
     end;

var f,g:text;
    i,n,m,nr:longint;
    s,ult:array[1..100000] of pnod;
    l:array[1..500000] of longint;
    viz:array[1..100000] of boolean;
    nou,nou2,p,q:pnod;

procedure citire;
  var x,y:longint;
  begin
    assign(f,'ciclueuler.in');
    reset(f);
    readln(f,n,m);

    for i:=1 to m do begin
      readln(f,x,y);
      new(nou);
      nou^.inf:=y;
      nou^.v:=false;
      new(nou2);
      nou2^.inf:=x;
      nou2^.v:=false;
      if s[x]=nil then begin
        s[x]:=nou;
        ult[x]:=s[x];
      end else begin
        ult[x]^.adr:=nou;
        ult[x]:=nou;
      end;
      if s[y]=nil then begin
        s[y]:=nou2;
        ult[y]:=s[y];
      end else begin
        ult[y]^.adr:=nou2;
        ult[y]:=nou2;
      end;
    end;

    close(f);
    assign(g,'ciclueuler.out');
    rewrite(g);
  end;

procedure dfs(k:longint);
  var p:pnod;
  begin
    viz[k]:=true;
    inc(nr);
    l[nr]:=k;

    if s[k]<>nil then begin
      p:=s[k];

      while p<>nil do begin
        if (viz[p^.inf]) and (not p^.v) and (p^.inf<>1) then begin
          p^.v:=true;
          q:=s[p^.inf];
          while (q^.inf<>k) or (q^.v=true) do q:=q^.adr;
          q^.v:=true;
          dfs(p^.inf);
        {  if s[k]=p then s[k]:=s[k]^.adr
          else begin
            q:=s[k];
            while q^.adr<>p do q:=q^.adr;
            q^.adr:=p^.adr;
            dispose(p);
            p:=q;
          end;   }
        end;
        p:=p^.adr;
      end;

      p:=s[k];
      while p<>nil do begin
        if (viz[p^.inf]=false) and (p^.v=false) then begin
          p^.v:=true;
          q:=s[p^.inf];
          while (q^.inf<>k) or (q^.v=true) do q:=q^.adr;
          q^.v:=true;
          dfs(p^.inf);
        end;
        p:=p^.adr;
      end;

    end;

  end;

procedure afisare;
  var n1,n2:longint;
  begin
    m:=0;        {
    for i:=1 to n do
      if not viz[i] then begin
        rewrite(g);
        write(g,-1);
        close(g);
        halt;
      end;
      if s[i]<>nil then begin
        p:=s[i];
        while p<>nil do begin
          if p^.v=false then begin
            m:=m+1;
            n1:=p^.inf;
            n2:=i;
            if (m>2) or (n1<>1) and (n2<>1) then begin
              rewrite(g);
              write(g,-1);
              close(g);
              halt;
            end;
          end;
          p:=p^.adr;
        end;
      end;        }
      for i:=1 to nr do write(g,l[i],' ');
      close(g);
  end;

BEGIN
  citire;
  dfs(1);
  afisare;
END.