Cod sursa(job #271387)

Utilizator sory1806Sandu Sorina-Gabriela sory1806 Data 5 martie 2009 11:09:18
Problema Ciclu Eulerian Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include<stdio.h>
#define nmax 100010
#define mmax 500010
long s[mmax], gr[nmax], vz[nmax], n, m;
struct elem
{       long vf;
	elem *urm;
}	*a[nmax], *q;
FILE *f, *g;

void 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 || gr[i]%2==1)
			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()
{	long sol[mmax], 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");
	read();
		if(check())
			solve();
		else
			fprintf(g, "-1\n");
	fclose(g);
	return 0;
}