Cod sursa(job #1123681)

Utilizator gbi250Gabriela Moldovan gbi250 Data 26 februarie 2014 09:38:43
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.27 kb
#include <cstdio>
#include <vector>
#include <stack>

#define SIZE 100003
using namespace std;

int n, m, degree[SIZE];
bool visited[SIZE], not_eulerian;
vector < int > adj[SIZE], sol;
stack < int > st;

inline void read();
inline void solve();
inline void write();

int main()
{
    read();
    solve();
    write();
    return 0;
}

inline void read()
{
    freopen("ciclueuler.in", "r", stdin);
    scanf("%d%d", &n, &m);

    while( m-- )
    {
        int x, y;
        scanf("%d%d", &x, &y);
        adj[ x ].push_back( y );
        adj[ y ].push_back( x );

        ++degree[ x ];
        ++degree[ y ];
    }
}

inline void DFS( int node )
{
    visited[ node ] = 1;
    for(vector <int> :: iterator it = adj[node].begin(); it != adj[node].end(); ++it)
        if( !visited[ *it ] )
            DFS( *it );
}

inline bool is_connected()
{
    DFS( 1 );
    for(int i = 1; i <= n; ++i)
        if( !visited[ i ] )
            return 0;
    return 1;
}

inline bool is_eulerian()
{
    if( ! is_connected() )
        return 0;

    for(int i = 1; i <= n; ++i)
        if( degree[i] % 2 )
            return 0;
    return 1;
}

inline void del_edge( int node1, int node2 )
{
    adj[node1].erase( adj[node1].begin() );

    for(vector <int> :: iterator it = adj[node2].begin(); it != adj[node2].end(); ++it)
        if( (*it) == node1 )
        {
            adj[ node2 ].erase( it );
            return;
        }
}

inline void euler( int node )
{
    while( true )
    {
        if( adj[node].empty() )
            return ;
        st.push( node );
        int node2 = adj[node].front();
        del_edge( node, node2 );
        node = node2;
    }
}

inline void solve()
{
    if( ! is_eulerian() )
    {
        not_eulerian = 1;
        return ;
    }

    int node = 1;

    do
    {
        euler( node );
        node = st.top();
        st.pop();
        sol.push_back( node );
    } while ( ! st.empty() );
}

inline void write()
{
    freopen("ciclueuler.out", "w", stdout);
    if( not_eulerian )
        printf("-1\n");
    else
    {
        for( vector <int> :: iterator it = sol.begin(); it != sol.end(); ++it)
            printf("%d ", *it);
        printf("\n");

    }
}