Cod sursa(job #1219037)

Utilizator suzanicaSuzanica Mihu suzanica Data 13 august 2014 11:29:32
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include <cstdio>
#define NM 100002
#define MM 500002
using namespace std;
int *a[NM];
int x[MM],y[MM];
int viz[NM];
int st[MM];
int vf,nr;
void df(int);
inline void swap(int &x,int &y)
{
    int aux=x;
   x=y;
   y=aux;
}
int n,m,grad[NM];
int main()
{
    freopen("ciclueuler.in","r",stdin);
    freopen("ciclueuler.out","w",stdout);
    scanf("%d %d",&n,&m);
   int i,c,d;
 for (i=1;i<=m;i++)
     {
         scanf("%d %d",&c,&d);
        x[i]=c;
        y[i]=d;
        grad[d]++;
        grad[c]++;
     }
 for (i=1;i<=n;i++)
      {
          a[i]=new int[grad[i]+1];
         a[i][0]=0;
      }
 for (i=1;i<=m;i++)
     {
         a[x[i]][0]++;
         a[x[i]][a[x[i]][0]]=y[i];
          a[y[i]][0]++;
         a[y[i]][a[y[i]][0]]=x[i];
     }
 df(1);
 for (i=1;i<=n;i++)
     if (grad[i]%2==1||viz[i]==0)
         {printf("-1");
          return 0;
         }
  vf=1;
  st[vf]=1;
 int x,y;
 while (vf)
     {
         x=st[vf];
      if (a[x][0]==0)
          {
              nr++;
           if (nr<=m)
              {printf("%d ",x);
              }
           vf--;
           continue;
          }
      y=a[x][a[x][0]];
      if (y==x)
          a[x][0]--;
      for (i=1;i<=a[y][0];i++)
          {
              if (a[y][i]==x)
              {
                  swap(a[y][i],a[y][a[y][0]]);
               break;
              }
          }
       if (y!=x)
           a[x][0]--;
       a[y][0]--;
       st[++vf]=y;
      }
 return 0;
}
void df(int k)
{viz[k]=1;
 int i;
 for (i=1;i<=a[k][0];i++)
     if (!viz[a[k][i]])
         {df(a[k][i]);
         }
}