Cod sursa(job #594353)

Utilizator stay_awake77Cangea Catalina stay_awake77 Data 7 iunie 2011 12:28:25
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include <fstream>
#include <vector>
#include <stack>
#include <cstring>

#define pb push_back
#define NMAX 100005
#define MMAX 500005

using namespace std;

ifstream in("ciclueuler.in");
ofstream out("ciclueuler.out");

vector< int > Muchii[NMAX], Sol;
stack< int > Noduri;
int Nod1[NMAX], Nod2[NMAX], i, N, M, Pos[NMAX], Nod;
bool Scoate, USEDM[MMAX];

int main()
{
    in >> N >> M;
    for( i = 1; i <= M; i++ )
    {
        in >> Nod1[i] >> Nod2[i];
        Muchii[ Nod1[i] ].pb( i );
        Muchii[ Nod2[i] ].pb( i );
    }

    for( i = 1; i <= N; i++ )
        if( Muchii[i].size()%2 )
        {
            printf("-1\n");
            return 0;
        }

    memset( Pos, 0, sizeof(Pos) );
    memset( USEDM, false, sizeof(USEDM) );

    Noduri.push( 1 );
    while( !Noduri.empty() )
    {
        Scoate = false;
        Nod = Noduri.top();

        for( i = Pos[Nod]; i < (int)Muchii[Nod].size(); i++ )
            if( !USEDM[ Muchii[Nod][i] ] )
            {
                USEDM[ Muchii[Nod][i] ] = true;
                ( Nod == Nod1[ Muchii[Nod][i] ] ) ? Noduri.push( Nod2[ Muchii[Nod][i] ] ) : Noduri.push( Nod1[ Muchii[Nod][i] ] );

                Pos[Nod] = i+1;
                Scoate = true;
                break;
            }

        if( !Scoate )
        {
            Sol.pb( Noduri.top() );
            Noduri.pop();
        }
    }

    for( i = 1; i < (int)Sol.size(); i++ )
        out << Sol[i] << ' ';
    out << '\n';

    return 0;
}