Cod sursa(job #765484)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 7 iulie 2012 22:29:24
Problema Ciclu Eulerian Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include<cstdio>
typedef struct nod
{int info;
nod *urm;}Nod;
int a[500005],b[500005],i,n,m,k,w[100001],*g[100001],j,c[100001],t;
Nod *l,*r;

void I(Nod *&l)
{Nod *p=l,*r,*q=l->urm;
do
       {if(w[p->info])
               j=g[p->info][0];
       for(k=0;k<w[p->info]-1;k++)
               g[p->info][k]=g[p->info][k+1];
       for(t=0;t<w[j]&&g[j][t]!=p->info;t++);
       for(k=t;k<w[j]-1;k++)
               g[j][k]=g[j][k+1];
       w[j]--,w[p->info]--;
       r=new Nod;
       r->info=j,r->urm=NULL,p->urm=r,p=r;}
while(r->info!=l->info);
p->urm=q;}

int A(Nod *&l)
{Nod *p;
for(p=l;p;p=p->urm)
if(w[p->info])
       {I(p);
       return 1;}
return 0;}

int P()
{for(int i=1;i<=n;i++)
if(w[i]%2)
       return 0;
return 1;}

int O()
{int i,p,s[500005];
s[1]=c[1]=p=1;
while(p)
      {j=s[p--];
      for(i=0;i<w[j];i++)
      if(!c[g[j][i]])
             c[g[j][i]]=1,s[++p]=g[j][i];}
for(i=1;i<=n;i++)
if(!c[i])
      return 0;
return 1;}

int main()
{freopen("ciclueuler.in","r",stdin);
freopen("ciclueuler.out","w",stdout);
scanf("%d%d",&n,&m);
for(i=1;i<=m;i++)
      scanf("%d%d",&a[i],&b[i]),w[a[i]]++,w[b[i]]++;
for(i=1;i<=n;w[i++]=0)
      g[i]=new int[w[i]];
for(i=1;i<=m;i++)
      g[a[i]][w[a[i]]++]=b[i],g[b[i]][w[b[i]]++]=a[i];
if(!O()||!P())
      printf("-1");
else
      {l=new Nod;
      l->info=1,l->urm=NULL;
      while(A(l));
      for(r=l->urm;r;r=r->urm)
             printf("%d ",r->info);}
return 0;}