Cod sursa(job #2216303)

Utilizator 24601Dan Ban 24601 Data 26 iunie 2018 12:09:21
Problema Ciclu Eulerian Scor 60
Compilator c Status done
Runda Arhiva educationala Marime 1.24 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[MMAX+1], nsol;
static int deg[NMAX+1];

static inline void ciclueuler(int v)
{
    for (int i = adj[v]; i != 0; i = edges[i].n) {
        if (!deleted[i]) {
            deleted[i] = 1;
            deleted[edges[i].p] = 1;
            ciclueuler(edges[i].v);
        }
    }

    sol[nsol++] = v;
}

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;
        }
    }

    ciclueuler(1);

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

    return 0;
}