Pagini recente » Cod sursa (job #2958591) | Cod sursa (job #336202) | Cod sursa (job #1703667) | Cod sursa (job #2414308) | Cod sursa (job #555883)
Cod sursa(job #555883)
#include <cstdio>
#include <list>
using namespace std;
#define NMAX 100050
#define MMAX 500050
int S[MMAX], M[MMAX], grad[NMAX], viz[NMAX], N, nod, fiu, n, m, i, x, y, v;
list < pair <int, int> > G[NMAX];
bool eulerian ();
void DFS (int);
int main () {
freopen ("ciclueuler.in", "r", stdin);
freopen ("ciclueuler.out", "w", stdout);
scanf ("%d %d", &n, &m);
for (i = 1; i <= m; i++) {
scanf ("%d %d", &x, &y);
grad[x]++, grad[y]++;
G[x].push_back (make_pair (y, i));
G[y].push_back (make_pair (x, i));
}
if (eulerian ()) {
S[++N] = 1;
while (N) {
nod = S[N];
if (!G[nod].empty ()) {
fiu = G[nod].back ().first, v = G[nod].back ().second;
if (!M[v]) S[++N] = fiu, M[v] = 1;
G[nod].pop_back ();
}
else printf ("%d ", S[N--]);
}
}
else printf ("-1");
return 0;
}
void DFS (int nod) {
viz[nod] = 1;
for (list < pair <int, int> >::iterator it = G[nod].begin (); it != G[nod].end (); it++)
if (!viz[it -> first])
DFS (it -> first);
}
bool eulerian () {
DFS (1);
for (int i = 1; i <= n; i++)
if (!viz[i] || (grad[i] & 1)) return 0;
return 1;
}