Cod sursa(job #2715820)

Utilizator Mihai145Oprea Mihai Adrian Mihai145 Data 4 martie 2021 11:42:10
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.23 kb
#include <fstream>
#include <vector>
#include <stack>

using namespace std;

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

const int NMAX = 1e5;
const int MMAX = 5e5;

int N, M, deg[NMAX + 2];
vector <pair<int, int>> g[NMAX + 2];

bool seen[MMAX + 2];

int main() {
    cin >> N >> M;

    for(int i = 1; i <= M; i++) {
        int x, y;
        cin >> x >> y;
        g[x].push_back({y, i});
        g[y].push_back({x, i});

        deg[x]++;
        deg[y]++;
    }

    for(int i = 1; i <= N; i++) {
        if(deg[i] % 2 == 1) {
            cout << -1 << '\n';
            return 0;
        }
    }

    stack <int> st;
    st.push(1);

    vector <int> sol;

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

        while(!g[curr].empty() && seen[g[curr].back().second]) {
            g[curr].pop_back();
        }

        if(!g[curr].empty()) {
            seen[g[curr].back().second] = true;

            st.push(g[curr].back().first);
            g[curr].pop_back();
        } else {
            sol.push_back(curr);
            st.pop();
        }
    }

    for(int i = 0; i < (int)sol.size() - 1; i++) {
        cout << sol[i] << ' ';
    }

    return 0;
}