Cod sursa(job #1550163)

Utilizator jimcarterJim Carter jimcarter Data 13 decembrie 2015 12:41:54
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#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;
}