Cod sursa(job #270106)

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

void read()
{	long i, x, y;
	fscanf(f, "%ld%ld", &n, &m);
	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;
	}
}

int check()
{	long cd[nmax], i, p, u;
	for(i=1; i<=n; i++)
		if(gr[i]%2==1)
			return 0;
	p=1; u=1; cd[1]=1;
	while(p<=u)
	{	for(q=a[cd[p]]; q; q=q->urm)
			if(vz[q->vf]==0)
			{	u++;
				cd[u]=q->vf; vz[q->vf]=1;
			}
		p++;
	}
	for(i=1; i<=n; i++)
		if(vz[i]==0)
			return 0;

	return 1;
}

void del(long x, long y)
{       elem *z;
	for(q->urm=a[x]; q->urm; q=q->urm)
	{	if(q->urm->vf==y)
		{	z=q->urm;
			q->urm=q->urm->urm;
			delete z;
		}
		break;
	}
	for(q->urm=a[y]; q->urm; q=q->urm)
	{	if(q->urm->vf==x)
		{	z=q->urm;
			q->urm=q->urm->urm;
			delete z;
		}
		break;
	}
}

void df(long z, long k)
{       elem *q;
	s[k]=z;
	del(s[k], s[k-1]);
	for(q=a[z]; q; q=q->urm)
	{	df(q->vf, k+1);
		x[++o]=q->vf;
	}
}

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