Cod sursa(job #2216309)

Utilizator 24601Dan Ban 24601 Data 26 iunie 2018 12:19:21
Problema Ciclu Eulerian Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.32 kb
#include <stdio.h>

#define NMAX 100000
#define MMAX 500000

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

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

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

    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]++;
        deg[v]++;
        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[u]++;
            deg[v]++;
        }
    }

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

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

        sol[nsol++] = v;
    }

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

    return 0;
}