Pagini recente » Cod sursa (job #354851) | Cod sursa (job #1751009) | Cod sursa (job #332399) | Cod sursa (job #2467445) | Cod sursa (job #917517)
Cod sursa(job #917517)
#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;
}