Cod sursa(job #305594)

Utilizator petrecgClinciu Glisca Petre petrecg Data 17 aprilie 2009 21:13:57
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include <stdio.h>
long a[4][1100001],v[100001],st[100001],fin[100001],i,x,y,n,m,k,l,stiva[1100001],poz[1100001],sol[1100001],gr[110001];
void dfs()
{stiva[1]=1;l=1;i=1;
 while(l)
  {
   while(i)
    {if(!a[3][i])
     {a[3][i]=1;if(i%2)a[3][i+1]=1;else a[3][i-1]=1;
      ++l;stiva[l]=a[1][i];
      i=v[a[1][i]];
     }
     else v[stiva[l]]=i=a[2][i];
    }
   --l;
   ++k;sol[k]=stiva[l];
  }
}
int main()
{freopen("ciclueuler.in","r",stdin);freopen("ciclueuler.out","w",stdout);
 scanf("%ld%ld",&n,&m);
 for(i=1;i<=m;i++)
  {scanf("%ld%ld",&x,&y);gr[x]++;gr[y]++;
   if(fin[x]==0){st[x]=fin[x]=l+1;l++;a[1][l]=y;}
	  else{a[2][fin[x]]=l+1;fin[x]=l+1;l++;a[1][l]=y;}
   if(fin[y]==0){st[y]=fin[y]=l+1;l++;a[1][l]=x;}
	  else{a[2][fin[y]]=l+1;fin[y]=l+1;l++;a[1][l]=x;}

  }
 for(i=1;i<=n;i++){v[i]=st[i];if(!st[i])k=1;if(gr[i]%2)k=1;}
 if(!k)dfs();
 fclose(stdin);
 if(k<m+1)printf("-1");
    else for(i=1;i<=m;i++)printf("%ld ",sol[i]);
    fclose(stdout);
 return 0;
}