Cod sursa(job #431965)

Utilizator tamas_iuliaTamas Iulia tamas_iulia Data 1 aprilie 2010 18:29:31
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <stdio.h>
#include <list>
#include <vector>
#include <stack>
#include <queue>
#define pb push_back
#define Nmax 100005
using namespace std;

list< int > G[Nmax],Veu;
list< int >:: iterator it;
stack< int > S;
queue< int > Q;

int n,m,i,x,y;
int use[Nmax],grad[Nmax];

void bfs(){
	int x;
	Q.push(1); use[1]=1;
	while( !Q.empty() ){
		x=Q.front();
		for(it=G[x].begin(); it!=G[x].end(); ++it)
			if(!use[*it]){
				use[*it]=1;
				Q.push(*it);
			}
		Q.pop();
	}
}	

void sterge(int v,int w){
	G[v].pop_front();
	for(it=G[w].begin(); it!=G[w].end(); ++it)
		if(*it==v){
			G[w].erase(it);
			break;
		}
}

int work(){
	int i,v,w;
	bfs();
	for(i=2;i<=n;++i) 
		if(!use[i]) return 0;
	for(i=1;i<=n;++i) 
		if( grad[i] & 1 ) return 0;
	
	v=1;
	do{
		while( !G[v].empty() ){
			w=G[v].front();
			S.push(v);
			sterge(v,w);
			v=w;
		}
		v=S.top(); S.pop();
		Veu.pb(v);
	} while( ! S.empty() );
	
	return 1;
}

void scrie(){
	for(it=Veu.begin(); it!=Veu.end(); ++it)
		printf("%d ",*it);
	printf("\n");
}	
	
int main(){
	freopen("ciclueuler.in","r",stdin);
	freopen("ciclueuler.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(i=1;i<=m;++i){
		scanf("%d%d",&x,&y);
		G[x].pb(y); grad[x]++;
		G[y].pb(x); grad[y]++;
	}
	
	if( !work() ) printf("%d\n",-1);
	else scrie();
	
	fclose(stdin); fclose(stdout);
	return 0;
}