Cod sursa(job #1915836)

Utilizator andreinmAndrei andreinm Data 8 martie 2017 22:42:00
Problema Ciclu Eulerian Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <fstream>
#include <vector>
#include <stack>

using namespace std;

ifstream in("ciclueuler.in");
ofstream out("ciclueuler.out");

struct Edge {
    int fn, sn;
    bool deleted;
};

const int NN = 1e5, NE = 5e5;

Edge e[NE];
int N, E, i;
vector <int> G[NN];
stack <int> S;

bool notEulerCircuit() {
    for (auto &it: G)
        if (it.size() & 1)
            return 1;
    return 0;
}

inline int get_nextNode(int node, int edge) {
    int next;
    (node == e[edge].fn) ? next = e[edge].sn : next = e[edge].fn;
    return next;
}

inline bool deleted(int edge) {
    return (e[edge].deleted);
}

void deleteEdge(int edge) {
    e[edge].deleted = true;
}

void printCircuit(int start) {
    S.push(start);
    while (!S.empty()) {
        int crtNode = S.top();

        if (!G[crtNode].empty()) {
            int crtEdge = G[crtNode].back();
            G[crtNode].pop_back();

            if (deleted(crtEdge))
                continue;

            deleteEdge(crtEdge);
            S.push(get_nextNode(crtNode, crtEdge));

        } else {
            out << S.top() << ' ';
            S.pop();
        }
    }
}

int main()
{
    in >> N >> E;
    for (i = 1; i <= E; ++i) {
        in >> e[i].fn >> e[i].sn;
        G[e[i].fn].push_back(i);
        G[e[i].sn].push_back(i);
    }

    if (notEulerCircuit()) {
        out << "-1\n";
    } else {
        printCircuit(1);
    }

    return 0;
}