Cod sursa(job #575098)

Utilizator dushmiMihai-Alexandru Dusmanu dushmi Data 7 aprilie 2011 21:50:16
Problema Ciclu Eulerian Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.97 kb
#include <fstream>
#include <list>
#include <vector>

using namespace std;

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

const int N = 100010;

list <int> L[N];

vector <int> v, rez;

int n, gr[N];

void read() {
    int m, x, y;

    in >> n >> m;
    for (int i = 1; i <= m; ++ i) {
        in >> x >> y;
        L[x].push_back(y);
        ++ gr[x];
        L[y].push_back(x);
        ++ gr[y];
    }
}

bool verif() {
    for (int i = 1; i <= n; ++ i)
        if (gr[i] & 1)
            return false;
    return true;
}

void ciclu_euler() {
    vector <int> :: iterator nc;
    list <int> :: iterator it2, it2n;
    bool ok, elim;

    v.push_back(1);

    while (! v.empty()) {
        ok = false;
        nc = v.end();
        -- nc;
        for (list <int> :: iterator it = L[*nc].begin(); it != L[*nc].end(); ++ it) {
            list <int> :: iterator itn = L[*it].end();
            -- itn;
            elim = false;
            for (itn = itn; itn != L[*it].begin(); -- itn)
                if(*nc == *itn) {
                    it2n = itn;
                    ++ it2n;
                    L[*it].erase(itn, it2n);
                    elim = true;
                    break;
                }
            if(*nc == *itn && (! elim)) {
                it2n = itn;
                ++ it2n;
                L[*it].erase(itn, it2n);
            }
            v.push_back(*it);
            it2 = it;
            ++ it2;
            L[*nc].erase(it, it2);
            ok = true;
            break;
        }

        if (ok == false) {
            rez.push_back(*nc);
            v.pop_back();
        }
    }
}

void afis() {
    vector <int> :: iterator it = rez.end();
    -- it;
    for (it = it; it != rez.begin(); -- it)
        out << *it << ' ';
}

int main() {
    read();
    if (! verif()) {
        out << "-1\n";
        return 0;
    }
    ciclu_euler();
    afis();
    return 0;
}