Cod sursa(job #1501602)

Utilizator depevladVlad Dumitru-Popescu depevlad Data 13 octombrie 2015 17:47:52
Problema Ciclu Eulerian Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
#include <fstream>
#include <algorithm>
#include <vector>
#include <stack>

using namespace std;

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

const int MAX_N = 100000;

int n, m;
bool U[1 + MAX_N];
int Deg[1 + MAX_N];
vector < int > A[1 + MAX_N];
vector < int > eCycle;
stack < int > S;

void dfs(int u) {
    for(auto i : A[u]) {
        if(U[i] == 0) {
            U[i] = 1;
            dfs(i);
        }
    }
}

void getEulerCycle() {
    int u, i, v;

    S.push(1);
    while(!S.empty()) {
        u = S.top();
        if(A[u].empty() == 1) {
            eCycle.push_back(u);
            S.pop();
        }
        else {
            v = A[u][A[u].size() - 1];

            A[u].pop_back();
            if(v != u) {
                for(i = 0; A[v][i] != u; i++);
                swap(A[v][i], A[v][A[v].size() - 1]);
                A[v].pop_back();
            }

            S.push(v);
        }
    }
}

int main() {
    int i, u, v;
    bool isConnected = 1, evenDeg = 1;

    in >> n >> m;
    for(i = 1; i <= m; i++) {
        in >> u >> v;
        A[u].push_back(v);
        if(u != v) {
            A[v].push_back(u);
            Deg[v]++;
            Deg[u]++;
        }
    }

    U[1] = 1;
    dfs(1);

    for(i = 1; i <= n && isConnected && evenDeg; i++) {
        isConnected &= U[i];
        evenDeg &= (Deg[i] % 2 == 0);
    }

    if(isConnected == 0 || evenDeg == 0) {
        out << "-1\n";
        return 0;
    }

    getEulerCycle();
    eCycle.pop_back();
    for(i = 0; i < eCycle.size(); i++)
        out << eCycle[i] << " ";
    out << "\n";

    return 0;
}