Cod sursa(job #1581957)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 27 ianuarie 2016 14:11:48
Problema Ciclu Eulerian Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.88 kb
#include <cstdio>
#include <algorithm>
#include <vector>
#include <stack>
#include <bitset>

const int DIM = 1 << 17;
using namespace std;

int node2, start, ok; stack <int> Stack;
int NrNodes, NrEdges, node, next_node, node1;
bitset <DIM> Marked; vector <int> Edges[DIM];

void DFS( int node ) {
    Marked[node] = 1;

    vector <int> :: iterator it;
    for( it = Edges[node].begin(); it != Edges[node].end(); it ++ ) {
        int next_node = *it;

        if( !Marked[next_node] )
            DFS( next_node );
    }

    return;
}

int main () {

    freopen( "ciclueuler.in" , "r", stdin  );
    freopen( "ciclueuler.out", "w", stdout );

    scanf( "%d %d", &NrNodes, &NrEdges );
    for( int i = 1; i <= NrEdges; i ++ ) {
        scanf( "%d %d", &node1, &node2 );

        Edges[node1].push_back(node2);
        Edges[node2].push_back(node1);
    }

    for( int i = 1; i <= NrNodes; i ++ ) {
        if( Edges[i].size() ) {
            start = i;
            DFS( i );
            break;
        }
    }

    ok = 1;
    for( int i = 1; i <= NrNodes; i ++ ) {
        if( Edges[i].size() % 2 || ( Edges[i].size() && !Marked[i] )) {
            ok = 0;
            break;
        }
    }

    if( ok == 0 )
        printf( "-1\n" );
    else {
        Stack.push(start); ok = 0;

        while( !Stack.empty() ) {
            node = Stack.top();

            if( Edges[node].size() ) {
                next_node = Edges[node].back();
                Stack.push( next_node );

                Edges[node].pop_back();
                Edges[next_node].erase( find( Edges[next_node].begin(), Edges[next_node].end(), node ));
            } else {
                if( ok )
                    printf( "%d ", node );
                else
                    ok = 1;

                Stack.pop();
            }
        }
    }

    return 0;
}