Pagini recente » Cod sursa (job #1070353) | Cod sursa (job #629634) | Cod sursa (job #1721397) | Cod sursa (job #28112) | Cod sursa (job #1929189)
#include <bits/stdc++.h>
using namespace std;
int nodes, edges, to[500005], from[500005];
bool deleted[500005];
vector <int> G[100005];
vector <int> S;
vector <int> ans;
bool isEuler () {
for (int i = 1; i <= nodes; ++ i) {
if (G[i].size() % 2 == 1)
return false;
}
return true;
}
int Find_Next (int edge, int node) {
return (from[edge] == node ) ? to[edge] : from[edge];
}
void Run_Euler () {
S.push_back (1);
while (!S.empty ()) {
int crt_node = S.back ();
if (!G[crt_node].empty()) {
int edge = G[crt_node].back ();
G[crt_node].pop_back ();
if(deleted[edge])
continue;
deleted[edge] = true;
S.push_back (Find_Next (edge, crt_node));
}
else {
S.pop_back();
ans.push_back (crt_node);
}
}
ans.pop_back ();
for (auto &it: ans) {
printf ("%d ", it);
}
}
int main()
{
freopen ("ciclueuler.in", "r", stdin);
freopen ("ciclueuler.out", "w", stdout);
scanf ("%d%d", &nodes, &edges);
for (int i = 1; i <= edges; ++ i) {
int node1, node2;
scanf ("%d%d", &node1, &node2);
G[node1].push_back (i);
G[node2].push_back (i);
from[i] = node1;
to[i] = node2;
}
if (isEuler ()) {
Run_Euler ();
}
else {
printf ("-1\n");
}
return 0;
}