Cod sursa(job #583625)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 21 aprilie 2011 14:03:58
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.28 kb
#include<stdio.h>
#include<stdlib.h>
#define N 100001
#define M 500001
typedef struct nod
{long info;
struct nod *urm;}Nod,*list;
long a[M],b[M],d[M],i,n,m,k,deg[N]={0},*g[N],j,c[N]={0},t;
Nod *l,*r;
void ciclu(long *g[N],long deg[N],list &l)
{long i,k,t,j,e,f;
Nod *ab=l,*ag,*au=l->urm;
do
      {for(i=0;i<deg[ab->info];i++)
              {j=g[ab->info][i];
              k=i;
              break;}
      for(e=k;e<deg[ab->info]-1;e++)
              g[ab->info][e]=g[ab->info][e+1];
      deg[ab->info]--;
      for(t=0;t<deg[j];t++)
      if(g[j][t]==ab->info)
              {k=t;
              break;}
      for(f=k;f<deg[j]-1;f++)
              g[j][f]=g[j][f+1];
      deg[j]--;
      ag=new Nod;
      ag->info=j;
      ag->urm=NULL;
      ab->urm=ag;
      ab=ag;}
while(ag->info!=l->info);
ab->urm=au;}

int adauga(long *g[N],long deg[N],list &l)
{long i,gasit=0,j;
Nod *p=l;
while(p!=NULL&&gasit==0)
      {if(deg[p->info]>0)
             gasit=1;
      if(gasit==0)
             p=p->urm;}
if(p!=NULL)
      {ciclu(g,deg,p);
      return 1;}
else
      return 0;}

int grade_pare(long *g[N],long deg[N])
{long i=1,j,s,gasit=0;
while(i<=n&&gasit==0)
      {if(deg[i]%2==1)
              gasit=1;
      i++;}
return (!gasit);}

void df(long *g[N],long deg[N],long k)
{long i,sp=0,st[N];
st[++sp]=k;
c[k]=1;
while(sp>0)
      {j=st[sp--];
      for(i=0;i<deg[j];i++)
      if(c[g[j][i]]==0)
              {c[g[j][i]]=1;
              st[++sp]=g[j][i];}}}

int conex(long *g[N],long deg[N],long n)
{long i,gasit=0;
df(g,deg,1);
for(i=1;i<=n;i++)
if(c[i]==0)
      gasit=1;
return (!gasit);}

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;deg[i++]=0)
      g[i]=(long*)malloc(deg[i]*sizeof(long));
for(i=1;i<=m;i++)
      {g[a[i]][deg[a[i]]++]=b[i];
      g[b[i]][deg[b[i]]++]=a[i];}
if(conex(g,deg,n)==0||grade_pare(g,deg)==0)
      printf("-1");
else
      {l=new Nod;
      l->info=1;
      l->urm=NULL;
      while(adauga(g,deg,l)==1);
      for(r=l->urm;r!=NULL;r=r->urm)
             printf("%ld ",r->info);}
fclose(stdin);
fclose(stdout);
return 0;}