Cod sursa(job #796160)

Utilizator veleanduAlex Velea veleandu Data 10 octombrie 2012 19:30:08
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include <cstdio>
#include <iostream>
#include <vector>
using namespace std;

    #define pb push_back
    #define fi first
    #define se second
    #define max_n 100005
    #define max_m 500005

    vector <int> V[max_n];
    int n,m,a,b,i;
    pair<int,int> Mu[max_m];
    bool Nr[max_n];
    bool Viz_m[max_m];
    bool Viz[max_n];
    int Rez[max_m],rez;
    int It[max_n];

    int Stiva[max_m+max_n];
    int Stv;
    void df ( )
    {
        #define nod Stiva[Stv]
        #define it It[nod]
        for ( ; it <V[ nod ].size();   )
        {
            if ( !Viz_m[ V[ nod ][ it ] ] )
            {
                Viz_m[ V[ nod ][ it ] ]=1;

                Stiva [ Stv+1 ]= Mu [ V[nod][it] ].fi + Mu [ V[nod][it] ].se- Stiva[ Stv ];
                it++;
                Stv++;
                df ( );
            }
            else{
                it++;
            }
        }
        Rez[ ++rez ]=nod;
        Viz[ nod ]=1;
        Stv--;
    }

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

    scanf ("%d %d", &n, &m );
    for ( i=1; i<=m; i++ )
    {
        scanf ("%d %d ", &a, &b );
        Mu[i].fi=a;
        Mu[i].se=b;
        V[a].pb(i);
        V[b].pb(i);

        Nr[a]^=1;
        Nr[b]^=1;
    }

    for ( i=1; i<=n; i++ )
        if ( Nr[i] )
        {
            printf("-1\n");
            return 0;
        }
    Stiva[ ++Stv ]=1;
    df();
    for ( i=1; i<=n; i++ )
        if ( !Viz[ i ] )
        {
            printf("-1\n");
            return 0;
        }
    for ( i=1; i<rez; i++ )
        printf("%d ",Rez[i]);

    return 0;
}