Cod sursa(job #270762)

Utilizator cameleonGeorgescu Dan cameleon Data 4 martie 2009 15:49:57
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include<stdio.h>
#define nmax 100010
#define mmax 500010
long s[mmax], vz[nmax], n, m;
struct elem
{       long vf;
	elem *urm;
}	*a[nmax], *q;
FILE *f, *g;

int read()
{	long gr[nmax], i, x, y;
	fscanf(f, "%ld%ld", &n, &m);
	for(i=1; i<=n; i++)
		gr[i]=0;
	for(i=1; i<=m; i++)
	{	fscanf(f, "%ld%ld", &x, &y);
		gr[x]++; gr[y]++;
		q=new elem;
		q->vf=y; q->urm=a[x];
		a[x]=q;
		q=new elem;
		q->vf=x; q->urm=a[y];
		a[y]=q;
	}
	for(i=1; i<=n; i++)
		if(gr[i]%2==1)
			return 0;
	return 1;
}

void df1(long z, long k)
{       elem *q;
	vz[z]=1;
	for(q=a[z]; q; q=q->urm)
		if(!vz[q->vf])
			df1(q->vf, k+1);
}

int check()
{	long i;
	df1(1, 1);
	for(i=1; i<=n; i++)
		if(vz[i]==0)
			return 0;
	return 1;
}
void del(int x,int y){
  elem* q,*r,*p;
  q=a[x];
  a[x]=a[x]->urm;
  delete(q);
  if(a[y]->vf==x){
     p=a[y];
    a[y]=a[y]->urm;
    delete(p);
  }
  else
    for(r=a[y];r->urm;r=r->urm)
      if(r->urm->vf==x){
	p=r->urm;
	r->urm=r->urm->urm;
	delete (p);
	break;	
      }
}
void solve()
{
int sol[mmax];
  int x,vf,k=0,i;
  vf=1;
  s[vf]=1;
  while(vf){
    x=s[vf];
    if(a[x]!=NULL){
      s[++vf]=a[x]->vf;
      del(x,a[x]->vf);
    }
    else sol[++k]=s[vf--];
  }
  for(i=1;i<k;i++)
    fprintf(g,"%d ",sol[i]);
}

int main()
{
	f=fopen("ciclueuler.in", "r");
	g=fopen("ciclueuler.out", "w");
	if(read())
		if(check())
			solve();
		else
			fprintf(g, "-1\n");
	else
			fprintf(g, "-1\n");

	return 0;
}