Cod sursa(job #1438588)

Utilizator BLz0rDospra Cristian BLz0r Data 20 mai 2015 12:52:05
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.02 kb
#include <cstdio>
#include <vector>
#include <algorithm>
#include <bitset>
#include <stack>
using namespace std;

#define Nmax 100002

FILE *f = fopen ( "ciclueuler.in", "r" );
FILE *g = fopen ( "ciclueuler.out", "w" );

vector < int > G[Nmax];
stack < int > st, ciclu;
bool viz[Nmax];
int grad[Nmax], N, M, visited = 0;

void Conex ( int nod ){
   vector < int > :: iterator it;

    viz[nod] = 1;
    visited++;

    for ( it = G[nod].begin(); it < G[nod].end(); ++it ){
        if ( !viz[*it] )
            Conex ( *it );
    }
}

bool Eulerian(){
    for ( int i = 1; i <= N; ++i )
        if ( grad[i] & 1 )
            return 0;

    Conex( 1 );

    if ( visited != N )
        return 0;

    return 1;
}

void Sterge ( int x, int y ){
    vector < int > :: iterator it;

    for ( it = G[x].begin(); it < G[x].end(); ++it ){
        if ( *it == y ){
            G[x].erase(it);
            break;
        }
    }

    for ( it = G[y].begin(); it < G[y].end(); ++it ){
        if ( *it == x ){
            G[y].erase(it);
            break;
        }
    }
}

void Euler ( int nod ){
    int aux;
    vector < int > :: iterator it;

    while ( !G[nod].empty() ){
        it = G[nod].begin();
        st.push( nod );
        aux = *it;
        Sterge ( nod, aux );
        nod = aux;
    }
}

void Afisare(){

    while ( !ciclu.empty() ){
        fprintf ( g, "%d ", ciclu.top() );
        ciclu.pop();
    }
}

int main(){

    vector < int > :: iterator it;
    int x, y;

    fscanf ( f, "%d%d", &N, &M );

    for ( int i = 1; i <= M; ++i ){
        fscanf ( f, "%d%d", &x, &y );
        G[x].push_back ( y );
        G[y].push_back ( x );
        grad[x]++;
        grad[y]++;
    }

    if ( !Eulerian() ){
        fprintf ( g, "-1" );
        return 0;
    }

    int nod = 1;

    do{
        Euler( nod );
        nod = st.top();
        st.pop();
        ciclu.push ( nod );
    }while ( !st.empty() );

    Afisare();

    return 0;
}