Cod sursa(job #2241230)

Utilizator nurof3nCioc Alex-Andrei nurof3n Data 15 septembrie 2018 12:57:53
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <bits/stdc++.h>

using namespace std;

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

const int N_MAX = 100000;
const int M_MAX = 500000;
int N, M;
vector <int> Nodes[N_MAX + 1], Cycle, elim;
vector <pair<int, int>> Edges;
stack <int> S;

void euler_iterativ() {
    S.push(1);
    while(!S.empty()) {
        int nod = S.top();
        if(!Nodes[nod].empty()) {
            int ind = Nodes[nod].back();
            Nodes[nod].pop_back();
            if(!elim[ind]) {
                elim[ind] = true;
                int x = Edges[ind].second;
                if(x == nod)
                    x = Edges[ind].first;
                S.push(x);
            }
        } else {
            S.pop();
            Cycle.push_back(nod);
        }
    }
}

int main() {

    in >> N >> M;
    int x, y;
    for(int i = 0; i < M; i++) {
        in >> x >> y;
        Edges.push_back(make_pair(x, y));
        elim.push_back(0);
        //inseram indicele muchiei din care face parte
        Nodes[x].push_back(Edges.size() - 1);
        Nodes[y].push_back(Edges.size() - 1);
    }

    for(int i = 1; i <= N; i++)
        if(Nodes[i].size() & 1) {
            out << -1;
            return 0;
        }

    euler_iterativ();

    Cycle.pop_back();
    if(Cycle.size() != M) {
        out << -1;
        return 0;
    }
    for(auto nod : Cycle) {
        out << nod << ' ';
    }

    return 0;
}