Cod sursa(job #272172)

Utilizator cameleonGeorgescu Dan cameleon Data 6 martie 2009 15:26:01
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include<fstream.h>
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");
const int Nmax=100001;
const int Mmax=500001;
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)
		{
			elem *q=p->urm;
			p->urm=p->urm->urm;
			delete q;
			break;
		}
 }
 else
 {
	p=a[y];
	 a[y]=a[y]->urm;
	delete p;
 }
}

void stiva1()
{
	long vf=1;
	st[vf]=1;
	while(vf)
	{
		long v=st[vf];
		if(a[v])
		{
			vf++;st[vf]=a[v]->inf;
			sterge(v,a[v]->inf);
			
		}
		else
			b[++nr]=st[vf--];
	}
}
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();
 df(1);
 if(grad())
 {
	stiva1();
	afisare();
 }
 else
	g<<-1<<'\n';
 g.close();
 return 0;
}