Pagini recente » Cod sursa (job #46887) | Cod sursa (job #1686910) | Cod sursa (job #3222935) | Cod sursa (job #2452932) | Cod sursa (job #1499760)
#include <fstream>
#include <vector>
#include <stack>
#include <algorithm>
using namespace std;
ifstream fin ("ciclueuler.in");
ofstream fout ("ciclueuler.out");
const int NMAX = 100001;
const int MMAX = 500001;
int N; int M;
vector<int> cycle;
vector<int> G[NMAX];
stack<int> S;
int In[NMAX];
void read() {
fin >> N >> M;
for(int i = 1; i <= M; ++i) {
int x; int y;
fin >> x >> y;
G[x].push_back(y);
G[y].push_back(x);
In[x]++;
In[y]++;
}
}
bool check_euler() {
for(int i = 1; i <= N; ++i)
if(In[i] % 2 != 0)
return 0;
return 1;
}
void euler() {
S.push(1);
while(S.empty() == false) {
int x = S.top();
if(G[x].size() == 0) {
//cand un nod nu mai are vecini insemna ca am terminat un ciclu
//acum ori ma intorc si incep sa bag noduri care formeaza un alt ciclu(dar care se termina obligatoriu cu nodul pe care tocmai l.am bagat si care a inceput ciclul)
//ori inchid acest si ma intorc pana ajung sa bag din nou acest nod x
cycle.push_back(x);
S.pop();
} else {
int nody = G[x][ G[x].size() - 1];//iau ultimul nod , nu primul pentru ca vreau sa si il sterg usor
G[x].pop_back();
S.push(nody);
for(unsigned i = 0 ; i < G[nody].size(); ++i)
if(G[nody][i] == x) {
swap(G[nody][i], G[nody][ G[nody].size() - 1 ]);
break;
}
G[nody].pop_back();
}
}
}
int main() {
read();
if(!check_euler()) {
fout << -1;
return 0;
}
euler();
for(unsigned i = 0 ; i < cycle.size() - 1; ++i)
fout << cycle[i] << " ";
return 0;
}