Cod sursa(job #308838)

Utilizator mihnea_andreiMihnea Andrei mihnea_andrei Data 28 aprilie 2009 18:42:52
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include<fstream> 
#define N 100005
#define M 500005

using namespace std;

int nr=0,n,m,d[N],c[M],stvf[M],stvec[M],x[M],y[M]; 
int *a[N],*poz[N]; 

ofstream out ("ciclueuler.out"); 

void citire () 
{ 
	ifstream in ("ciclueuler.in"); 
	in>>n>>m; 
	for(int i=1;i<=m;i++) 
	{
		in>>x[i]>>y[i]; 
		d[x[i]]++; 
		if(x[i]!=y[i])
			d[y[i]]++; 
	}
}

void aloc () 
{ 
	for(int i=1;i<=n;i++) 
	{ 
		a[i]=new int [1+d[i]]; 
		a[i][0]=0; 
		poz[i]=new int [1+d[i]]; 
		poz[i][0]=0;
		d[i]=0;
	}
}

void completez () 
{ 
	int aux;
	aux=m;
	for(int i=1;i<=m;i++) 
	{
		a[x[i]][++a[x[i]][0]]=y[i];
		++d[x[i]];
		++d[y[i]];
		if(x[i]!=y[i]) 
		{	
			a[y[i]][++a[y[i]][0]]=x[i]; 
			poz[x[i]][a[x[i]][0]]=a[y[i]][0]; 
			poz[y[i]][a[y[i]][0]]=a[x[i]][0]; 
		} 
	}
}	

void euler (int z) 
{ 
	int t,k=1; 
	stvf[k]=z; 
	stvec[k]=0; 
	while (k) 
	{ 
		z=stvf[k]; 
		if(stvec[k]<a[z][0]) 
		{ 
			t=a[z][++stvec[k]]; 
			if(t==0) 
				continue; 
			a[z][stvec[k]]=0; 
			if(z!=t) 
				a[t][poz[z][stvec[k]]]=0; 
			stvf[++k]=t; 
			stvec[k]=0; 
			continue; 
		}
		c[++nr]=z; 
		k--;
	}
}

bool verif()
{
	for(int i=1;i<=n;++i)
		if(d[i]&1)
			return false;
	return true;
}

inline void scrie () 
{ 
	for(int i=1;i<=nr-1;i++) 
		out<<c[i]<<" ";
}
int main () 
{ 
	citire (); 
	aloc(); 
	completez (); 
	euler(1); 
	if(verif()) 
		scrie (); 
	else 
		out<<-1; 
	out.close ();
	return 0; 
}