Cod sursa(job #2942150)

Utilizator juniorOvidiu Rosca junior Data 19 noiembrie 2022 06:29:29
Problema Ciclu Eulerian Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.74 kb
// Incercare: punem nodul in ciclu cand ajungem prima data la el.
#include <fstream>
#include <stack>
#include <vector>
using namespace std;

const int NMAX = 100005, MMAX = 500005;

ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");
int n, nm, i, j, mc, nu, m;
vector<int> vm[NMAX], e;
int s[MMAX], d[MMAX];
bool  u[MMAX];
stack<int> st;

bool eulerian () {
    bool e = true;
    for (int i = 1; i <= n; i++) 
        if (vm[i].size() & 1 == 1)
            e = false;
    return e;
}

int main() {
    fin >> n >> m;
    for (int im = 1; im <= m; im++) {
        fin >> i >> j;
        s[im] = i;      // sursa
        d[im] = j;      // destinatia
        u[im] = false;  // Muchia nu este utilizata.
        vm[i].push_back(im); // muchie incidenta cu i
        vm[j].push_back(im);
    }
    if (not eulerian()) {
        fout << -1;
    }
    else {
        st.push(1);
        e.push_back(1); // Punem in ciclul eulerian.
        while (not st.empty()) {
            int nod = st.top();
            if (not vm[nod].empty()) {
                mc = vm[nod].back(); // muchia curenta
                vm[nod].pop_back();
                if (not u[mc]) {
                    u[mc] = true; // muchie utilizata
                    nu = d[mc];   // nodul urmator
                    if (nu == nod)
                        nu = s[mc];
                    st.push(nu);
                    e.push_back(nu); // Punem in ciclul eulerian.
                }
            }
            else 
                st.pop();
        }
        for (auto nod : e)
            fout << nod << " ";
    }
    return 0;
}

// 1 2 6 
// 1 6 4 3 7 5 3 6 2 1
//    1 6             2 1
//        4 3       6
//            7 5 3