Cod sursa(job #238772)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 3 ianuarie 2009 11:46:20
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.97 kb
#include<stdio.h>
#define N 100010
#define M 500010
struct nod { int inf;nod *urm;};
nod *A[N],*B[N];
int ok,n,m,i,aa,bb,C[N],e,a[M],b[M];
char t[M];
int readd();
void euler();
int main()
{       ok=readd();
	if(!ok){printf("-1\n");return 0;}
	euler();
	return 0;
}
int readd()
{       int gr[N],q[N],pr,ul,nc,nv,ec;
	nod *v[N],*paux;
	freopen("ciclueuler.in","rt",stdin);
	freopen("ciclueuler.out","wt",stdout);
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;i++){ gr[i]=0;v[i]=0;}
	for(i=1;i<=m;i++)
	{ scanf("%d%d",&aa,&bb);
	  //separam de la inceput muchiile care cicleaza de cele proprii
	  if(aa==bb){C[aa]++;continue;}
	  e++;a[e]=aa;b[e]=bb;t[e]='b';
	  gr[aa]++;gr[bb]++;
	  paux=new nod;paux->inf=e;
	  paux->urm=v[aa];v[aa]=paux;
	  paux=new nod;paux->inf=e;
	  paux->urm=v[bb];v[bb]=paux;
	}
	for(i=1;i<=n;i++){ if(gr[i]&1)return 0;gr[i]=0;}
	q[1]=1;gr[1]=1;
	pr=ul=1;
	while(pr<=ul)
	{ nc=q[pr];
	  for(paux=v[nc];paux;paux=paux->urm)
	  { ec=paux->inf;
	    nv=a[ec]+b[ec]-nc;
	    if(gr[nv])continue;
	    gr[nv]=1;q[++ul]=nv;t[ec]='a';
	  }
	  pr++;
	}
	if(ul<n)return 0;
	return 1;
}
void euler()
{       nod *paux;
        int nc,ec;
	for(i=1;i<=e;i++)
	{ if(t[e]=='b')
	  { paux=new nod;paux->inf=e;
	    paux->urm=B[a[e]];B[a[e]]=paux;
	    paux=new nod;paux->inf=e;
	    paux->urm=B[b[e]];B[b[e]]=paux;
	  }
	  else
	  { paux=new nod;paux->inf=e;
	    paux->urm=A[a[e]];A[a[e]]=paux;
	    paux=new nod;paux->inf=e;
	    paux->urm=A[b[e]];A[b[e]]=paux;
	  }
	}
	nc=1;
	for(;;)
	{ while(C[nc]){printf("%d ",nc);continue;}
	  while(B[nc]&&t[B[nc]->inf]=='e')B[nc]=B[nc]->urm;
	  if(B[nc])
	  { ec=B[nc]->inf;B[nc]=B[nc]->urm;
	    printf("%d ",nc);
	    t[ec]='e';
	    nc=a[ec]+b[ec]-nc;
	    continue;
	  }
	  while(A[nc]&&t[A[nc]->inf]=='e')A[nc]=A[nc]->urm;
	  if(A[nc])
	  { ec=A[nc]->inf;A[nc]=A[nc]->urm;
	    printf("%d ",nc);
	    t[ec]='e';
	    nc=a[ec]+b[ec]-nc;
	    continue;
	  }
	  printf("\n");break;
	}
}