Cod sursa(job #2417635)

Utilizator SqueekDanielTodasca Daniel SqueekDaniel Data 30 aprilie 2019 17:09:50
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.4 kb
#include <bits/stdc++.h>

#define int_pair std::pair <int, int>

#define MAXN 100005
#define MAXM 500005

int N, M;
bool seen[MAXM];
std::vector <int> ADC[MAXN];
std::vector <int_pair> edges;

inline void addEdge(int x, int y) {
    ADC[x].push_back(edges.size());
    ADC[y].push_back(edges.size());
    edges.push_back({x, y});
}

bool isEulerian() {
    for (int i=1; i<=N; ++i)
        if (ADC[i].size()&1)
            return false;
    return true;
}

std::vector <int> cycle;
std::stack  <int> stack;
void buildCycle() {
    stack.push(1);
    int top, idx;
    while (!stack.empty()) {
        top = stack.top();
        if (ADC[top].empty())
            stack.pop(), cycle.push_back(top);
        else {
            idx = ADC[top].back();
            ADC[top].pop_back();
            if (seen[idx]) continue;
            seen[idx] = 1;
            stack.push(edges[idx].first + edges[idx].second - top);
        }
    }
}

std::ifstream input ("ciclueuler.in");
std::ofstream output("ciclueuler.out");

void readInput() {
    input >> N >> M;
    for (int i=1, x, y; i<=M; ++i)
        input >> x >> y, addEdge(x, y);
}

void solveInput() {
    if (!isEulerian()) {output << "-1\n"; return;}
    buildCycle();
    cycle.pop_back();
    for (auto it:cycle)
        output << it << ' ';
}

int main()
{
    readInput();
    solveInput();

    return 0;
}