Cod sursa(job #708023)

Utilizator DuxarFII-Stefan-Negrus Duxar Data 6 martie 2012 11:23:26
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.98 kb
#include<cstdio>
#include<vector>
#define NMAX 100002
#define MMAX 500002
#define INfile "ciclueuler.in"
#define OUTfile "ciclueuler.out"

using namespace std;

vector < int > V [ NMAX ] , CE ;
int g [ NMAX ] , viz [ NMAX ] , S [ MMAX ] ;
int N , M , ok1 , TS ;

void check () ;
void read () ;
void solve () ;
void euler ( int ) ;
void write () ; 
void erase ( int S , int D ) ;

int main ()
{
	freopen ( INfile , "r" , stdin ) ;
	freopen ( OUTfile , "w" , stdout ) ;
		
	read () ;
	
	check () ;
	
	if ( ok1 ) 
		printf ( "-1\n" ) ;
	else
		solve () ;
	
	return 0 ;
}

void read ()
{
	int i , x , y ;
	scanf ( "%d%d" , & N , & M ) ;
	for ( i = 1 ; i <= M ; ++ i ) 
	{
		scanf ( "%d%d" , & x , & y ) ;
		++ g [ x ] ;
		++ g [ y ] ;
		V [ x ].push_back ( y ) ;
		V [ y ].push_back ( x ) ;
	}
}

void check () 
{
	int i , s , d ;
	for ( i = 1 ; i <= N ; ++ i )
		if ( g [ i ] % 2 ) 
		{
			ok1 = 1 ;
			return ; 
		}
	
	int in , sf ;
	int Q [ NMAX ] ;
	in = sf = 1 ;
	Q [ in ] = 1 ;
	viz [ 1 ] = 1 ;
	while ( in <= sf ) 
	{
		s = Q [ in ] ;
		++ in ; 
		for ( i = 0 ; i < g [ s ] ; ++ i )
		{
			d = V [ s ][ i ] ;
			if ( viz [ d ] == 0 )
			{
				++ sf ;
				Q [ sf ] = d ;
				viz [ d ] = 1 ;
			}
		}
	}
	
	if ( sf != N ) 
		ok1 = 1 ;
}

void solve() 
{
	int v ;
	v = 1 ;
	do { 
		euler ( v ) ;
		v = S [ TS ] ; -- TS ;
		CE . push_back ( v ) ;
	} while ( TS ) ;
	
	write () ;
}

void euler ( int v ) 
{
	int w ;
	while ( 1 ) 
	{
		if ( ! g [ v ] ) 
			return ; 
		S [ ++ TS ] = v ;  
		w = V [ v ][ 0 ] ;
		
		erase ( v , w ) ;
		
		v = w ;
	}
}

void erase ( int S , int D ) 
{
	swap ( V [ S ][ 0 ] , V [ S ][ -- g [ S ] ]  ) ; 
	
	int i ;
	
	for ( i = 0 ; i < g [ D ] ; ++ i  )
		if ( V [ D ][ i ] == S ) 
		{
			swap ( V [ D ][ i ] , V [ D ][ -- g [ D ] ] ) ;
			return ; 
		}
}

void write () 
{
	int i ;
	for ( i = 0 ; i < ( int ) CE.size () ; ++ i ) 
		printf ( "%d " , CE [ i ] ) ;
}