Cod sursa(job #239011)

Utilizator blasterzMircea Dima blasterz Data 3 ianuarie 2009 20:41:21
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 2.09 kb
using namespace std;
#include <cstdio>
#include <cstdlib>
#include <string>
#include <vector>
#define N 100001
#define dim 8192
#define pb push_back

char ax[dim];
int pz;

inline void cit(int &x)
{
	x=0;
	while(ax[pz]<'0' || ax[pz]>'9')
		if(++pz == dim) fread(ax,1,dim,stdin),pz=0;
	while(ax[pz]>='0' && ax[pz]<='9')
	{
		x=x*10+ax[pz]-'0';
		if(++pz == dim)fread(ax,1,dim,stdin),pz=0;
	}
}


typedef vector<int> vi;
typedef vector<int>:: iterator vit;
typedef vector<pair<int, int> > vip;
typedef vector<pair<int, int> > ::iterator vipit;

vi a[N];

const int maxh=660777;

vip H[maxh];

inline void insert(int x, int y)
{
	if(x > y) x^=y^=x^=y;
	
	int h=((x%maxh)*17+(y%maxh))%maxh;
	
	H[h].pb(make_pair(x,y));
}

inline void sterge(int x, int y)
{
	if(x > y) x^=y^=x^=y;
	
	int h=((x%maxh)*17+(y%maxh))%maxh;
	
	for(vipit i=H[h].begin(); i!=H[h].end(); )
		if(i->first == x && i->second == y)
		{
			i=H[h].erase(i);
			return;
		}
		else ++i;
		
}
	
inline int find(int x, int y)
{
	if(x > y) x^=y^=x^=y;
	
	int h=((x%maxh)*17+(y%maxh))%maxh;
	
	for(vipit i=H[h].begin(); i != H[h].end(); ++i)
		if(i->first == x && i->second == y)
			return 1;
	return 0;
}
int n, m;
int st[600001];
int ns;


inline void dfs(int n)
{
	for(vit i=a[n].begin(); i!=a[n].end(); ++i)
		if(find(n, *i))
		{
			sterge(*i, n);
			dfs(*i);
		}
	
	st[++ns]=n;
}

int g[N];
			
	
void solve()
{
	dfs(1);
	int i;
	for(i=1;i<=ns;++i)printf("%d ",st[i]);
	printf("\n");
	
}

bool use[N];

void df(int n)
{
	use[n]=1;
	
	for(vit i=a[n].begin(); i!=a[n].end(); ++i)
		if(!use[*i])
			df(*i);
}

int main()
{
	freopen("ciclueuler.in","r",stdin);
	freopen("ciclueuler.out","w",stdout);
	
	cit(n); cit(m);
	
	int i,p,q;
	for(i=1;i<=m;++i)
	{
		cit(p);cit(q);
		g[p]++;
		g[q]++;
		a[p].pb(q);
		insert(p,q);
		//insert(q, p);
		a[q].pb(p);
	}
	int ok=1;
	for(i=1;i<=n;++i) 
		if(g[i]%2) { ok=0;break;}
	
	df(1);
	for(i=1;i<=n;++i)
		if(use[i]==0) { ok=0;break;}
	
	if(!ok) printf("-1\n");
		else solve();
	return 0;
}