Cod sursa(job #1520902)

Utilizator bciobanuBogdan Ciobanu bciobanu Data 9 noiembrie 2015 17:57:06
Problema Ciclu Eulerian Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <fstream>

using namespace std;

const int MAX_N = 100000;
const int MAX_M = 500000;
const int NIL = -1;

struct Edge {
    int v, next;
};

Edge l[2 * MAX_M];
int adj[MAX_N];
int degree[MAX_N];
int st[MAX_M + 1], ss;

void addEdge(int u, int v, int pos) {
    l[pos] = { v, adj[u] };
    adj[u] = pos;
    degree[u]++;
}

void euler(int u, ofstream &out) {
    st[ss++] = u;
    while (ss) {
        u = st[ss - 1];
        while (adj[u] != NIL && l[ adj[u] ].v == NIL) {
            adj[u] = l[ adj[u] ].next;
        }
        if (adj[u] != NIL) {
            st[ss++] = l[ adj[u] ].v;
            l[ adj[u] ^ 1 ].v = NIL;
            adj[u] = l[ adj[u] ].next;
        } else {
            ss--;
            if (ss) {
                out << 1 + u << ' ';
            }
        }
    }
}

int main(void) {
    ifstream in("ciclueuler.in");
    ofstream out("ciclueuler.out");
    int n, m;

    in >> n >> m;
    for (int i = 0; i < n; i++) {
        adj[i] = NIL;
    }
    for (int i = 0; i < m; i++) {
        int u, v;
        in >> u >> v;
        addEdge(u - 1, v - 1, 2 * i);
        addEdge(v - 1, u - 1, 2 * i + 1);
    }

    int odd = 0;
    while ((odd < n) && ~(degree[odd] & 1)) {
        odd++;
    }

    if (odd < n) {
        out << "-1";
    } else {
        euler(l[0].v, out);
    }
    out << '\n';
    out.close();
    return 0;
}