Cod sursa(job #2509372)

Utilizator alex02Grigore Alexandru alex02 Data 14 decembrie 2019 10:32:59
Problema Ciclu Eulerian Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include <bits/stdc++.h>

using namespace std;

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

struct muchie {
    int from, to;
    bool vis;
} muchii[500010];

vector<int> graph[100010];
stack<int> st;

int gr[100010], k, n, m;

void citire() {
    f >> n >> m;
    for (int i = 0; i < m; i++) {
        int x, y;
        f >> x >> y;
        graph[x].push_back(k);
        graph[y].push_back(k);
        muchii[k++] = {x, y, false};
        gr[x]++;
        gr[y]++;
    }
}

bool iiEulerian() {
    for (int i = 1; i <= n; i++)
        if (gr[i] & 1)
            return 0;
    return 1;
}

void rezolva() {
    st.push(0);
    while (!st.empty()) {
        int nod = st.top();
        if (graph[nod].empty()) {
            st.pop();
            if (!st.empty())
                g << nod << ' ';
            continue;
        }
        int last = graph[nod].back();
        int from = muchii[last].from, to = muchii[last].to;
        bool vis = muchii[last].vis;
        graph[nod].pop_back();
        if (vis)
            continue;
        if (from != nod)
            swap(from, to);
        st.push(to);
        muchii[last].vis = true;
    }
}

int main() {
    citire();
    if (!iiEulerian()) {
        g << -1;
        return 0;
    }
    rezolva();
    return 0;
}