Pagini recente » Cod sursa (job #463239) | Cod sursa (job #664168) | Cod sursa (job #175431) | Cod sursa (job #1602285) | Cod sursa (job #1937140)
#include <fstream>
#include <vector>
#include <stack>
#include <map>
#define DIM 100005
using namespace std;
ifstream f ("ciclueuler.in");
ofstream g ("ciclueuler.out");
int grad[DIM], c[DIM], mp[DIM];
int n, nrs, x, y, m, nr;
vector <pair <int, int> > G[DIM];
stack <int> stiva;
void dfs (int node) {
c[node] = 1;
for (vector <pair <int, int> > :: iterator it = G[node].begin(); it != G[node].end(); ++it) {
if (c[it -> first] == 0) {
dfs (it -> first);
}
}
}
void euler () {
stiva.push (1);
int ok = 1;
while (!stiva.empty ()) {
int node = stiva.top();
if (grad[node] == 0) {
if (ok == 0) {
g << node << " ";
}
ok = 0;
stiva.pop();
}
else {
while (!G[node].empty() && mp[G[node][G[node].size () - 1].second] == 1) {
G[node].pop_back ();
}
if (G[node].empty ())
continue;
int v = G[node][G[node].size () - 1].first;
int aux = G[node][G[node].size () - 1].second;
mp[aux] = 1;
--grad[node];
--grad[v];
stiva.push(v);
}
}
}
int main() {
f >> n >> m;
for (int i = 1; i <= m; ++i) {
f >> x >> y;
G[x].push_back ({y, ++nr});
G[y].push_back ({x, nr});
++grad[x];
++grad[y];
}
for (int i = 1; i <= n; ++i) {
if (grad[i] % 2 == 1) {
g << -1;
return 0;
}
}
dfs (1);
for (int i = 1; i <= n; ++i) {
if (c[i] == 0) {
g << -1;
return 0;
}
}
euler ();
return 0;
}