Cod sursa(job #1423028)

Utilizator AndreiBarbutaAndrei Barbuta AndreiBarbuta Data 20 aprilie 2015 21:49:43
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <fstream>
#include <stack>
#include <vector>
#include <algorithm>

#define IN "ciclueuler.in"
#define OUT "ciclueuler.out"

#define t top
#define p pop
#define pu push
#define pb push_back

const int MAX = 100014 ;

using namespace std;

ifstream fin ( IN ) ;
ofstream fout ( OUT ) ;

vector  < int > gr [ MAX ] ;

stack < int > s ;

void euler ( int nod ) ;

int ciclu [ MAX ] , u , n , m ;

int main()
{
    fin >> n >> m ;
    for ( register int i = 1 ; i <= m ; ++ i ) {
        int x , y ;
        fin >> x >> y ;
        gr [ x ].pb ( y ) ;
        gr [ y ].pb ( x ) ;
    }
    for ( register int i = 1 ; i <= n ; ++ i )
        if ( gr [ i ].size ( ) & 1 ){
            fout << "-1" ;
            return 0 ;
        }
    euler ( 1 ) ;
    for ( register int i = 1 ; i < u ; ++ i )
        fout << ciclu [ i ] << " " ;
    return 0;
}

void euler ( int nod ){
    s.pu ( 1 ) ;
    while ( !s.empty ( ) ){
        int x = s.top ( ) ;
        if ( gr [ x ].size ( ) ) {
            int y = gr [ x ].back ( ) ;
            s.pu ( y ) ;
            gr [ x ].pop_back ( ) ;
            gr [ y ].erase ( find ( gr [ y ].begin ( ) , gr [ y ].end ( ) , x ) ) ;
        }
        else{
            ciclu [ ++ u ] = x ;
            s.p ( ) ;
        }
    }
}