Cod sursa(job #358549)

Utilizator irene_mFMI Irina Iancu irene_m Data 23 octombrie 2009 17:39:07
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 3.87 kb
#include <cstdio>
#define MaxN 100010

struct nod{
      int x;
      nod *urm;
};

nod *G[MaxN],*c,*uc,*c1,*uc1;

int N,uz[MaxN],t,d[MaxN];

void add(int x,int y)
{
      nod *aux=new nod;
      aux->x=y; aux->urm=G[x];
      G[x]=aux;
}

void cit()
{
      int i,x,y,M;
      freopen("ciclueuler.in","r",stdin);
      scanf("%d%d",&N,&M);
      for(i=1;i<=M;i++)
      {
            scanf("%d%d",&x,&y);
            d[x]++; d[y]++;
            add(x,y);
            add(y,x);
      }
}

void dfs(int Nod)
{
      nod *q=new nod;
      uz[Nod]=1;

      q=G[Nod];
      while(q)
      {
            if(!uz[q->x])
                  dfs(q->x);
            q=q->urm;
      }
}

int conex()
{
      dfs(1);
      for(int i=1;i<=N;i++)
            if(!uz[i])
                  return 0;
      return 1;
}

int eulerian()
{
      if(!conex())
            return 0;

      for(int i=1;i<=N;i++)
            if(!d[i] || d[i]%2)
                  return 0;
      return 1;
}

void sterge(int x,int Nod)
{
      nod *q=new nod,*pred=new nod;
      q=G[x];
      if(G[x]->x==Nod)
      {
            if(G[x]->urm)
                  G[x]=G[x]->urm;
      }
      else
            pred=G[x]; q=G[x]->urm;
            while(q)
            {
                  if(q->x==Nod)
                  {
                        pred->urm=q->urm;
                        return;
                  }
                  q=q->urm;
                  pred=pred->urm;
            }
}


int adiac(int Nod)
{
      int x;
      nod *q=new nod;
      q=G[Nod];
      x=q->x;
      sterge(x,Nod);
      if(G[Nod]->urm)
            G[Nod]=G[Nod]->urm;
      return x;
}

void ciclu1(int Nod,nod *c,nod *uc,int sw)
{
      int x,pred=Nod;
      nod *q;

      while(sw)
      {
            x=adiac(pred);

            q=new nod;
            q->x=x;
            if(sw==1)
                  c=q, uc=q;
            else
                  uc->urm=q, uc=q, uc->urm=0;
            d[x]--; d[pred]--;
            if(x==Nod)
                  return;
            pred=x;
            sw++;
      }
}

void ciclu2(int Nod,int sw)
{
      int x,pred=Nod;
      nod *q;

      while(sw)
      {
            x=adiac(pred);

            q=new nod;
            q->x=x;
            if(sw==1)
                  c1=q, uc1=q;
            else
                  uc1->urm=q, uc1=q, uc1->urm=0;
            if(x==Nod)
            {
                  d[x]--; d[pred]--;
                  return;
            }
            d[x]--; d[pred]--;
            pred=x;
            sw++;
      }
}

int cauta()
{
      nod *q=new nod;
      q=c;
      while(q)
      {
            if(d[q->x])
                  return q->x;
            q=q->urm;
      }
      return 0;
}

void concatenare(int Nod)
{
      nod *q=new nod,*w;
      q=c;
      while(q)
      {
            if(q->x==Nod)
            {
                  w=new nod;
                  w=q->urm;
                  q->urm=c1;
                  uc1->urm=w;
            }
            q=q->urm;
      }
}

int sol()
{
      int t=eulerian(),Nod=1;
      if(!t)
            return 0;

      c=new nod; uc=new nod;
      nod *q=new nod;
      q->x=1; q->urm=0;
      c=q; uc=q;

      ciclu1(1,c,uc,2);
      Nod=cauta();
      while(Nod)
      {
            c1=new nod; uc1=new nod;
            ciclu2(Nod,1);
            concatenare(Nod);
            Nod=cauta();
      }
      return 1;
}

void afis(int t)
{
      freopen("ciclueuler.out","w",stdout);
      if(!t)
            printf("-1");
      else
      {
            nod *q=new nod;
            q=c;
            while(q)
            {
                  printf("%d ",q->x);
                  q=q->urm;
            }
      }
}

int main()
{
      cit();
      afis(sol());
      return 0;
}