Pagini recente » Cod sursa (job #1543338) | Cod sursa (job #452989) | Cod sursa (job #2922261) | Cod sursa (job #2856774) | Cod sursa (job #1550163)
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
FILE *in = fopen ( "ciclueuler.in" , "r" ) , *out = fopen ( "ciclueuler.out" , "w" );
const int VMAX = 100005;
int vSize , eSize , i , x , y , deg [ VMAX ];
vector < int > g [ VMAX ] , tour;
bool possible = true;
void read()
{
fscanf ( in , "%d %d\n" , &vSize , &eSize );
for ( i = 0 ; i < eSize ; i ++ )
{
fscanf ( in , "%d %d\n" , &x , &y );
//add the edge to the graph
g [ x ] . push_back ( y );
g [ y ] . push_back ( x );
deg [ x ] ++ , deg [ y ] ++;
}
}
void checkDeg ()
{
for ( i = 1 ; i <= vSize ; i ++ )
if ( deg [ i ] % 2 == 1 )
{
possible = false;
return;
}
}
bool isNeighbour ( int v ) { return g [ v ] . size(); }
int pickNeighbour ( int v )
{
int aux = g [ v ] . back(); g [ v ] . pop_back();
for ( i = 0 ; i < g [ aux ] . size() ; i ++ )
if ( g [ aux ] [ i ] == v )
{
g [ aux ] . erase ( g [ aux ] . begin() + i );
break;
}
return aux;
}
void buildTour ( int v )
{
while ( isNeighbour ( v ) )
buildTour ( pickNeighbour ( v ) );
//add v to the tour
tour . push_back ( v );
}
void printTour ()
{
for ( i = 0 ; i < tour.size() - 1 ; i ++ )
fprintf ( out , "%d " , tour [ i ] );
}
int main()
{
read();
//check the parity of deg
checkDeg ();
//build tour from a random starting vertex only if it's possible
if ( possible )
{
buildTour ( 1 );
printTour ();
}
else fprintf ( out , "-1\n" );
return 0;
}