Cod sursa(job #2216486)

Utilizator 24601Dan Ban 24601 Data 26 iunie 2018 22:04:55
Problema Ciclu Eulerian Scor 50
Compilator c Status done
Runda Arhiva educationala Marime 1.59 kb
#include <stdio.h>

#define NMAX 100000
#define MMAX 500000

static struct edge {
    int v, n, p;
} edges[2*MMAX+1];

static struct stk {
    int v, i;
} stack[2*MMAX+1];

static int adj[NMAX+1], deleted[2*MMAX+1], sol[2*MMAX+1], deg[NMAX+1], nsol;
static int stop;

int main()
{
    int n, m, u, v, i;
    struct stk s;

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

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

    for (i = 1; i <= m; i++) {
        scanf("%d %d", &u, &v);
        edges[2*i].v = v;
        edges[2*i].n = adj[u];
        edges[2*i].p = 2*i+1;
        adj[u] = 2*i;

        deg[u]++;
        if (u != v) {
            edges[2*i+1].v = u;
            edges[2*i+1].n = adj[v];
            edges[2*i+1].p = 2*i;
            adj[v] = 2*i+1;

            deg[v]++;
        } else {
            deg[u]++;
        }
    }

    for (v = 1; v <= n; v++) {
        if (deg[v] & 1) {
            puts("-1");
            return 0;
        }
    }

    stack[stop].v = 1;
    stack[stop].i = 0;
    stop++;
    while (stop > 0) {
        s = stack[stop-1];
        for (s.i = s.i == 0 ? adj[s.v] : edges[s.i].n; s.i != 0; s.i = edges[s.i].n) {
            if (!deleted[s.i]) {
                deleted[s.i] = 1;
                deleted[edges[s.i].p] = 1;

                stack[stop].v = edges[s.i].v;
                stack[stop].i = 0;

                stop++;
                break;
            }
        }

        if (s.i == 0) {
            stop--;
            sol[nsol++] = s.v;
        }
    }

    for (i = 0; i < nsol - 1; i++) {
        printf("%d ", sol[i]);
    }

    return 0;
}