Cod sursa(job #917515)

Utilizator vendettaSalajan Razvan vendetta Data 17 martie 2013 23:28:53
Problema Ciclu Eulerian Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <set>
#include <queue>
#include <deque>

using namespace std;

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

#define nmax 100006

#define ll long long

int n, m, gr[nmax], c[nmax*6];
vector<int> gf[nmax];

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;
}

inline 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;
        }
    }
}

inline void bagaEuler(int nod){
    for(; gf[nod].size()!=0; ){
        int vc = gf[nod][0];
        gf[nod].erase( gf[nod].begin() );
        sterge(vc, nod);// sterg pe nod din lista lui vc
        bagaEuler(vc);
    }
    c[++c[0]] = nod;// dupa ce i-am terminat vecinii il bag in ciclu
}

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

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

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

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

    return 0;
}