Pagini recente » Rezultatele filtrării | Rezultatele filtrării | Borderou de evaluare (job #26736) | Rezultatele filtrării | Cod sursa (job #575098)
Cod sursa(job #575098)
#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;
}