Cod sursa(job #1317486)

Utilizator SeBy24Cont Sters SeBy24 Data 14 ianuarie 2015 22:20:25
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.83 kb
#include <fstream>
#include <list>
#include <stack>
#include <queue>

using namespace std;

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

list< int > G[100010], L;
stack< int > S;
queue< int > coada;

int n, m,i,u,v,w,deg[100010], col[100010];
bool bun=true;
list<int>::iterator it;

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

int main()
{
    f>>n>>m;
    for(i=0; i<m; i++)
    {
        f>>u>>v;
        G[u].push_back(v);
        deg[u]++;
        G[v].push_back(u);
        deg[v]++;
    }
    coada.push(1);
    col[1] = 1;
    while( !coada.empty() )
    {
        v = coada.front();
        coada.pop();

        for( it = G[v].begin(); it != G[v].end(); it++ )
            if(col[*it] == 0)
            {
                coada.push(*it);
                col[*it] = 1;
            }
    }

    for( i = 2; i <= n; i++ )
        if( col[i] == 0 )
        {
            bun=false;
            break;
        }

    for( i = 1; i <= n; i++ )
        if( deg[i] % 2 == 1 )
        {
            bun=false;
            break;
        }

    if(!bun) g<<"-1";
    else
    {
        v=1;
        do
        {
            while( true )
            {
                if(G[v].empty())
                    break;
                w = G[v].front();
                S.push(v);
                sterge(v,w);
                v = w;
            }
            v = S.top();
            S.pop();
            L.push_back(v);
        }
        while(!S.empty());

        for(it=L.begin(); it!=L.end(); it++)
            g<<*it<<" ";
        g<<'\n';

    }
    return 0;
}