Cod sursa(job #272159)

Utilizator cameleonGeorgescu Dan cameleon Data 6 martie 2009 15:14:28
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include<fstream.h>
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");
const int Nmax=101000;
const int Mmax=501000;
struct elem
{	int inf;
	elem *urm;
}*a[Nmax];
long n,m,nr,st[Mmax],b[Mmax],d[Nmax],viz[Nmax];

void add(long x,long y)
{
	elem *p=new elem;
	p->inf =y;
	p->urm=a[x];
	a[x]=p;
}

void citire()
{
 long x,y;
 f>>n>>m;
 for(long i=0;i<m;i++)
 {
	f>>x>>y;
	d[x]++;
	d[y]++;
	add(x,y);
	add(y,x);
 }
}

void afisare()
{
 for(int i=1;i<nr;i++)
 {
	g<<b[i]<<" ";
 }
}
void df(int x)
{
viz[x]=1;
for(elem *p=a[x];p;p=p->urm)
	if(!viz[p->inf])
		df(p->inf);
}
int grad()
{
 for(int i=1;i<=n;i++)
	if(d[i]%2!=0 || viz[i]==0)
		return 0;
 return 1;
}

void sterge(long x,long y)
{
 elem *p=a[x];
 a[x]=a[x]->urm;
 delete p;
 if(a[y]->inf!=x)
 {
	for(p=a[y];p->urm;p=p->urm)
		if(p->urm->inf==x)
		{
			p->urm=p->urm->urm;
			break;
		}
 }
 else
	a[y]=a[y]->urm;
}

void stiva(long niv,long x)
{
	st[niv]=x;
	if(a[x])
	{
		long y=a[x]->inf;
		sterge(x,y);
		stiva(niv+1,y);
	}
	b[++nr]=st[niv];
}

int main()
{
 citire();
 if(grad())
 {
				{
	stiva(0,1);
	afisare();
 }
 else
	g<<-1<<'\n';
 g.close();
 return 0;
}