Cod sursa(job #2570537)

Utilizator radugheoRadu Mihai Gheorghe radugheo Data 4 martie 2020 17:26:50
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.4 kb
#include <bits/stdc++.h>

using namespace std;

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

int n, m, i, x, y, muchie, nod, vecin;
int grad[100005];

bitset <500005> f;

vector <pair<int, int> > L[100005];

stack <int> stiva;

void dfs (int nod){
    int vecin, i;
    f[nod] = 1;
    for (i=0; i<L[nod].size(); i++){
        vecin = L[nod][i].first;
        if (f[vecin] == 0){
            dfs (vecin);
        }
    }
}

int main(){
    fin >> n >> m;
    for (i=1; i<=m; i++){
        fin >> x >> y;
        L[x].push_back ({y, i});
        L[y].push_back ({x, i}); //tin si muchiile
        grad[x]++, grad[y]++;
    }
    dfs (1);
    for (i=1; i<=n; i++){
        if (f[i] == 0 || grad[i]%2 == 1){
            fout << -1;
            return 0;
        }
    }
    f.reset();
    stiva.push (1);
    while (!stiva.empty()){
        nod = stiva.top();
        if (grad[nod] == 0){
            if (stiva.size() != 1){
                fout << nod << " ";
            }
            stiva.pop();
            continue;
        }
        while (f[L[nod].back().second] == 1){
            L[nod].pop_back();
        }
        vecin  = L[nod].back().first;
        muchie = L[nod].back().second;
        stiva.push(vecin);
        f[muchie] = 1;
        L[nod].pop_back();
        grad[vecin]--, grad[nod]--;
    }
    return 0;
}
//recapitulare