Cod sursa(job #917517)

Utilizator vendettaSalajan Razvan vendetta Data 17 martie 2013 23:30:47
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <set>
#include <queue>
#include <deque>
#include <stack>

using namespace std;

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

#define nmax 100006

#define ll long long

int n, m, gr[nmax];
vector<int> gf[nmax];
stack<int> st;
vector<int> q;

void citeste(){
    f >> n >> m;
    int x, y;
    for(int i=1; i<=m; ++i){
        f >> x >> y;
        gf[x].push_back(y);
        gf[y].push_back(x);
        ++gr[x]; ++gr[y];
    }
}

inline bool eEuler(){
    for(int i=1; i<=n; ++i) {
        if (gr[i] % 2 == 1){
            return 0;
        }
    }
    return 1;
}

void sterge(int nod, int vc){
    for(vector<int>::iterator it=gf[nod].begin(); it!=gf[nod].end(); ++it){
        if (*it == vc){
           gf[nod].erase(it);
           return;
        }
    }
}

void bagaEuler(int nod){
    //st[ ++st[0] ] = nod;
    st.push(nod);
    for(; st.size() != 0;){
        int nod = st.top();
        if (gf[nod].size() != 0){// daca ma mai pot duce in jos
            int vc = gf[nod][0]; gf[nod].erase( gf[nod].begin() );
            sterge(vc, nod);
            st.push(vc);// il bag si pe vc
        }else {// inseamna ca trebuie sa ma intorc inapoi pt ca am dat de un nod fara vecini
            q.push_back( st.top() );
            st.pop();
        }
    }
}

void rezolva(){
    if ( eEuler() == 0 ){
        g << -1 << "\n";
        return;
    }

    bagaEuler(1);
    for(int i=0; i<q.size(); ++i) g << q[i] << " ";
}

int main(){
    citeste();
    rezolva();

    f.close();
    g.close();

    return 0;
}