Cod sursa(job #2645758)

Utilizator WholeGrainAndy N WholeGrain Data 29 august 2020 15:33:55
Problema Ciclu Eulerian Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#include <iostream>
#include <vector>
#include <stack>
#include <set>
#include <fstream>

using namespace std;

#define CAP 100001

int n, m;

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

multiset<int> g[CAP];

bool visited[CAP];

int nodeCnt = 0;

void dfs(int v) {
    nodeCnt++;

    visited[v] = true;

    for (int next : g[v]) {
        if (!visited[next]) {
            dfs(next);
        }
    }
}

bool isConnected() {
    dfs(0);

    return nodeCnt == n;
}

bool isEven() {
    for (int i = 0; i < n; i++) {

        if (g[i].size() % 2 != 0) {
            return false;
        }
    }

    return true;
}

int main() {
    in >> n >> m;

    for (int i = 0; i < m; i++) {
        int u, v;

        in >> u >> v;

        u--;

        v--;

        g[u].insert(v);

        g[v].insert(u);
    }

    cout << '\n';

    if (!isConnected() || !isEven()) {
        out << -1 << '\n';

        return 0;
    }

    stack<int> s;

    s.push(0);

    while (!s.empty()) {
        int curr = s.top();

        if (!g[curr].empty()) {
            int next = *g[curr].begin();

            g[curr].erase(g[curr].lower_bound(next));

            g[next].erase(g[next].lower_bound(curr));

            s.push(next);
        }

        else {
            out << curr + 1 << " ";

            s.pop();
        }
    }

    return 0;
}