Cod sursa(job #797503)

Utilizator veleanduAlex Velea veleandu Data 14 octombrie 2012 11:10:57
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include <cstdio>
#include <vector>
using namespace std;

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

    pair<int,int> Mu[max_m];
    vector <int> T[max_n];

    bool V[max_m];
    int n,m,i,j,a,b,ok;
    int Sta;
    int Stiva[max_n+max_m];
    int It[max_n];
    int aux_nod,aux_it;

    int Rez[max_m],rez;

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;

        T[a].pb(i);
        T[b].pb(i);
    }

    for ( i=1; i<=n; i++ )
        if ( T[i].size()&1 )
        {
            printf("-1\n");
            return 0;
        }

    Stiva [Sta]=1;
    while ( Sta >=0 )
    {
        #define it It[nod]
        #define nod Stiva[Sta]
        ok=1;
        for ( ; it<T[nod].size(); )
        {
            aux_it=it;
            aux_nod=nod;
            if ( !V[ T[nod][it] ] )
            {
                V[ T[nod][it] ]=1;
                it++;

                Sta++;
                Stiva [ Sta ]= Mu[ T[aux_nod][aux_it] ].se + Mu[ T[aux_nod][aux_it] ].fi - aux_nod;
                ok=0;
                break;
            }
            else{
                it++;
            }
        }
        if ( ok )
        {
            Rez[++rez]=nod;
            Sta--;
        }
    }

    for ( i=1; i<rez; i++ )
        printf("%d ", Rez[i] );

    return 0;
}