Cod sursa(job #1134165)

Utilizator swim406Teudan Adina swim406 Data 6 martie 2014 09:31:22
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 3.96 kb
/*#include <stdio.h>
#include <fstream>
#include <list>
#include <stack>
#include <queue>
#define nmax 500001
#define NMAX 100001

using namespace std;

int N, M;
list <int> G[nmax];
int deg[NMAX];
queue <int> q;
bool viz[NMAX];
stack <int> S;
list <int> L;

int BFS (int v) {
    int count, x, y;
    q.push(v);
    viz[v] = 1;
    count = 1;
    while (!q.empty()) {
        x = q.front();
        q.pop();
        for (typeof(G[x].begin()) it = G[x].begin(); it != G[x].end(); ++it) {
            y = *it;
            if (!viz[y]) viz[y] = 1, ++count, q.push(y);
        }
    }
    if (count == N) return 1;
    return 0;
}

int eulerian () {
    for (int i = 1; i <= N; ++i)
        if (deg[i] % 2 != 0) return 0;
    return 1;
}

void sterge (int v, int w) {
    --deg[v], --deg[w];
    G[v].pop_front();
    for (typeof (G[w].begin()) it = G[w].begin(); it != G[w].end(); ++it)
        if (*it == v) {
            G[w].erase(it);
            break;
        }
}

void euler (int v) {
    while (true) {
        if (G[v].empty())
            break;
        int w = G[v].front();
        S.push(v);
        sterge (v, w);
        v = w;
    }
}

int main() {
    freopen ("ciclueuler.in", "r", stdin);
    freopen ("ciclueuler.out", "w", stdout);
    int i, x, y, ok, v;
    scanf ("%d %d", &N, &M);
    for (i = 1; i <= M; ++i) {
        scanf ("%d %d", &x, &y);
        ++deg[x];
        ++deg[y];
        G[x].push_back(y);
        G[y].push_back(x);
    }
    while (true) {
        if (!BFS(1)) {
            printf ("-1\n");
            break;
        }
        if (!eulerian()) {
            printf ("-1\n");
            break;
        }
        v = 1;
        do {
            euler( v );
            v = S.top(); S.pop();
            L.push_back (v);
        } while(!S.empty());
        for (typeof (L.begin()) it = L.begin(); it != L.end(); ++it)
            printf ("%d ", *it);
        printf ("\n");
        break;
    }
    return 0;
}
*/

#include <fstream>
#include <list>
#include <stack>
#include <queue>

using namespace std;

#define TR( C, it ) \
    for( typeof(C.begin()) it = C.begin(); it != C.end(); it++ )
#define pb push_back

#define NX 100010

list< int > G[ NX ], L;
stack< int > S;
queue< int > Q;

int N, M, deg[ NX ], col[ NX ];

void cit() {
    int u, v;

    scanf( "%d%d", &N, &M );

    while( M-- ) {
        scanf( "%d%d", &u, &v );
        G[u].pb( v ); deg[u]++;
        G[v].pb( u ); deg[v]++;
    }
}

void BFS( int v ) {
    Q.push( v ); col[v] = 1;
    while( !Q.empty() ) {
        v = Q.front(); Q.pop();
        TR( G[v], w )
            if( col[ *w ] == 0 )
                Q.push( *w ), col[ *w ] = 1;
    }
}

int este_conex() {
    BFS( 1 );
    for( int v = 2; v <= N; v++ )
        if( col[ v ] == 0 )
            return 0;
    return 1;
}

int eulerian() {
    if( este_conex() == 0 )
        return 0;

    for( int v = 1; v <= N; v++ )
        if( deg[ v ] % 2 == 1 )
            return 0;
    return 1;
}

void sterge( int v, int w ) {
    deg[v]--, deg[w]--;
    G[v].pop_front();
    TR( G[w], it )
        if( *it == v ) {
            G[w].erase( it );
            break;
        }
}

void euler( int v ) {
    while( true ) {
        if( G[v].empty() )
            break;
        int w = G[v].front();
        S.push( v );
        sterge( v, w );
        v = w;
    }
}

int rez() {
    int v = eulerian();
    if( v == 0 )
        return -1;
    do {
        euler( v );
        v = S.top(); S.pop();
        L.pb( v );
    } while( !S.empty() );

    return 1;
}

void scr( int x ) {
    if( x == -1 )
        printf( "-1\n" );
    else {
        TR( L, v )
            printf( "%d ", *v );
        printf( "\n" );
    }
}

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

    cit();
    scr( rez() );

    return 0;
}