Cod sursa(job #1890885)

Utilizator DysKodeTurturica Razvan DysKode Data 23 februarie 2017 16:12:31
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include <fstream>
#include <stack>
#include <vector>
#include <cstdlib>

using namespace std;

#define f first
#define s second

ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");

int a,b,c,n,m,x,y,ok,use[100010],muchii[500010],grad[100010],nrnoduri,i,top;
vector < pair<int,int> > G[100010];
vector < pair<int,int> > ::iterator stick[ 100010 ];
int stk[ 1000010 ],ans[1000010];

void DF( int nod )
{
    ++nrnoduri;
    if( grad[ nod ] % 2 )
    {
        fout<<-1;
        exit( 0 );
    }
    use[ nod ] = 1;
    for( auto it : G[ nod ] )
        if( !use[ it.f ] )
            DF( it.f );
}

int main()
{

    fin>>n>>m;
    for( i = 1 ; i <= m ; i++ )
    {
        fin>>x>>y;
        G[ x ].push_back( {y,i} );
        G[ y ].push_back( {x,i} );
        grad[ x ]++;
        grad[ y ]++;
    }

    DF( 1 );
    if( nrnoduri < n )
    {
        fout<<-1;
        return 0;
    }

    for( i = 0 ; i <= n ; i++ )
    {
        stick[ i ] = G[ i ].begin();
    }
    stk[ 1 ] = 1;
    top = 1;
    while( top >= 1 )
    {
        while( stick[ stk[ top ] ] == G[ stk[ top ] ].end() )
        {
            fout<<stk[ top ]<<' ';
            --top;
        }

        for( ; stick[ stk[ top ] ] != G[ stk[ top ] ].end() ; stick[ stk[ top ] ]++ )
        {
            if( muchii[ ( *stick[ stk[ top ] ] ).s ] == 1 )
                continue;
            muchii[ ( *stick[ stk[ top ] ] ).s ] = 1;
            stk[ top + 1 ] = ( *stick[ stk[ top ] ] ).f;
            top++;
            break;
        }
    }


return 0;
}