Cod sursa(job #2576705)

Utilizator maria15Maria Dinca maria15 Data 6 martie 2020 21:53:22
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.81 kb
#include <bits/stdc++.h>

using namespace std;

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

int n, m, i, a, b, grad[100002], nod, vecin, nr;
vector<pair<int, int> > v[100002];
int stiva[500003];
bitset<500005> f;

int main(){
    fin>>n>>m;
    for(i=1;i<=m;i++){
        fin>>a>>b;
        v[a].push_back({b, i});
        v[b].push_back({a, i});
        grad[a]++;
        grad[b]++;
    }
    for(i=1;i<=n;i++)
        if(grad[a] % 2 == 1){
            fout<<-1;
            return 0;
        }
    nr = 1;
    stiva[1] = 1;
    while(nr){
        /// practic, stiva este a unui dfs care incepe sa rezolve un nod, dar apoi trece la urmatorul
        nod = stiva[nr];
        if(grad[nod] == 0){
            /// daca am terminat toti ciclii care il contin pe nod,
            /// atunci nod se poate odihni in pace, in sfarsit
            /// si il scot din stiva, afisandu-l
            if(nr > 1)
                fout<<nod<<" ";
            nr--;
        }
        else{
            /// scot definitiv muchiile care au fost sterse doar la un capat
            /// (celalalt capat, nu nod)
            /// dar nu le scot pe toate cele posibile, caci as pierde timp cu mutatul altor elemente in vector
            /// le scot doar pe cele carora le vine randul, pana cand gasesc una nestearsa, al carei capat il oun in stiva
            while(f[v[nod].back().second] == 1)
                v[nod].pop_back();
            if(v[nod].size()!=0){
                vecin = v[nod].back().first;    /// capatul unei muchii inca nesterse
                f[v[nod].back().second] = 1;    /// acum e stearsa si asta
                grad[vecin]--, grad[nod]--;     /// fiecare are acum cu o muchie mai putin
                stiva[++nr] = vecin;
            }
        }
    }
    return 0;
}