Cod sursa(job #583542)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 20 aprilie 2011 19:08:43
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include<stdio.h>
#include<stdlib.h>
#define N 100001
#define M 500001
long a[M],b[M],d[M],c[M]={0},i,n,m,k=0,l=0,deg[N]={0},*g[N],*h[N],x,j;

int main()
{freopen("ciclueuler.in","r",stdin);
freopen("ciclueuler.out","w",stdout);
scanf("%ld%ld\n",&n,&m);
for(i=1;i<=m;i++)
      {scanf("%ld%ld\n",&a[i],&b[i]);
      deg[a[i]]++;
      deg[b[i]]++;}
for(i=1;i<=n;i++)
      {g[i]=(long*)malloc(deg[i]*sizeof(long));
      h[i]=(long*)malloc(deg[i]*sizeof(long));
      deg[i]=0;}
for(i=1;i<=m;i++)
      {g[a[i]][deg[a[i]]]=b[i];
      h[a[i]][deg[a[i]]]=0;
      deg[a[i]]++;
      g[b[i]][deg[b[i]]++]=a[i];
      h[b[i]][deg[b[i]]]=0;
      deg[b[i]]++;}
d[k]=1;
while(k<=m&&l==0)
      {l=1;
      for(i=deg[d[k]]-1;i>=0;i--)
      if(h[d[k]][i]==0)
            {h[d[k]][i]=1;
            deg[d[k]]--;
            x=g[d[k]][i];
            for(j=0;j<deg[x];j++)
            if(g[x][j]==d[k]&&h[x][j]==0)
                   {h[x][j]=1;
                   break;}
            d[++k]=x;
            l=0;
            break;}}
if(k==m)
      {for(i=1;i<=m;i++)
             printf("%ld ",d[i]);}
else
      printf("-1");
fclose(stdin);
fclose(stdout);
return 0;}