Cod sursa(job #2837344)

Utilizator George_CristianGeorge Dan-Cristian George_Cristian Data 22 ianuarie 2022 09:58:54
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.84 kb
#include <fstream>
#include <vector>
#include <stack>
#include <cstdlib>

using namespace std;

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

struct muchie {
    int x, y;
    bool viz;
};

#define NMAX 100005

int n, m;
vector<muchie> muchii;
vector<int> vecini[NMAX];
stack<int> st;
vector<int> v_afisare;

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

void stergere_muchii_utilizate(int x) {
    while (!vecini[x].empty() && muchii[vecini[x][vecini[x].size() - 1]].viz)
        vecini[x].pop_back();
}

int gasire_vecin(int nr_muchie, int x) {
    if (x == muchii[nr_muchie].x)
        return muchii[nr_muchie].y;
    return muchii[nr_muchie].x;
}

int alegere_urmatorul_vecin(int x) {
    stergere_muchii_utilizate(x);
    if (vecini[x].empty()) {
        g << -1;
        exit(0);
    }
    int nr_muchie = vecini[x][vecini[x].size() - 1];
    muchii[nr_muchie].viz = true;
    int y = gasire_vecin(nr_muchie, x);
    vecini[x].pop_back();
    st.push(y);
    return y;
}

void cautare_ciclu_eulerian() {
    while (!st.empty()) {
        int x = st.top();
        stergere_muchii_utilizate(x);
        if (vecini[x].empty()) {
            v_afisare.push_back(x);
            st.pop();
            continue;
        }
        int y = alegere_urmatorul_vecin(x);
        while (x != y)
            y = alegere_urmatorul_vecin(y);
    }
}

void verificare_ramase() {
    for (auto &much: muchii)
        if (!much.viz) {
            g << -1;
            exit(0);
        }
}

void afisare() {
    for (int i = v_afisare.size() - 1; i > 0; i--)
        g << v_afisare[i] << ' ';
}

int main() {
    citire();
    st.push(1);
    cautare_ciclu_eulerian();
    verificare_ramase();
    afisare();
}