Cod sursa(job #2367134)

Utilizator LucaSeriSeritan Luca LucaSeri Data 5 martie 2019 08:52:45
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 kb
#include <bits/stdc++.h>

using namespace std;

const int MAXN = 1e5 + 10;
const int MAXM = 5e5 + 10;

vector< pair< int, int > > gr[MAXN];
stack< int > dfs;
bool viz[MAXM];
int deg[MAXN];

int main () {
    #ifdef HOME
        freopen("input", "r", stdin);
        #define f cin
        #define g cout
    #else
        ifstream f("ciclueuler.in");
        ofstream g("ciclueuler.out");
    #endif // HOME

    int n, m;
    f >> n >> m;

    for(int i = 0; i < m; ++i) {
        int a, b;
        f >> a >> b;

        gr[a].emplace_back(b, i);
        gr[b].emplace_back(a, i);
        deg[a] ++;
        deg[b] ++;
    }

    for(int i = 1; i <= n; ++i) {
        if(!deg[i] || (deg[i]&1)) {
            g << -1;
            return 0;
        }
    }

    dfs.push(1);
    vector< int > ans;
    while(dfs.size()) {
        int node = dfs.top();
        if(gr[node].size()) {
            int x , e;
            tie(x, e) = gr[node].back();
            gr[node].pop_back();
            if(!viz[e]) {
                viz[e] = true;
                dfs.push(x);
            }
        } else {
            dfs.pop();
            ans.emplace_back(node);
        }
    }

    ans.pop_back();
    for(auto &x : ans) g << x << ' ';
    return 0;
}