Cod sursa(job #1802081)

Utilizator antanaAntonia Boca antana Data 9 noiembrie 2016 20:51:21
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <cstdio>
#define MAXN 100000
#define MAXM 500000

int a, n, r, m, k, gr[MAXN+1], lista[MAXN+1], val[MAXM*2+1], nxt[MAXM*2+1], from[MAXM+1], to[MAXM+1], st[MAXM+1], ans[MAXM+1];
bool used[MAXM+1];

inline void adauga(int x, int y)
{
    val[++r] = y;
    nxt[r] = lista[x];
    lista[x] = r;
}

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

    int i, x, y, nod, mc, p;

    scanf("%d%d", &n, &m);

    for(i=1; i<=m; ++i)
    {
        scanf("%d%d", &x, &y);
        adauga(x, i);
        adauga(y, i);
        from[i] = x;
        to[i] = y;
        gr[x]++;
        gr[y]++;
    }

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

    st[++k] = 1;

    while(k)
    {
        nod = st[k];
        p = lista[nod];

        if(p)
        {
            mc = val[p];
            lista[nod] = nxt[p];

            if(!used[mc])
            {
                used[mc] = 1;
                if(from[mc] == nod)
                    st[++k] = to[mc];
                else st[++k] = from[mc];
            }
        }
        else
        {
            ans[++a] = nod;
            k--;
        }
    }

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

    return 0;
}