Pagini recente » Cod sursa (job #1136063) | Monitorul de evaluare | Cod sursa (job #1189345) | Cod sursa (job #1656840) | Cod sursa (job #2216485)
#include <stdio.h>
#define NMAX 100000
#define MMAX 500000
static struct edge {
int v, n, p;
} edges[2*MMAX+1];
static struct stk {
int v, i;
} stack[2*MMAX+1];
static int adj[NMAX+1], deleted[2*MMAX+1], sol[2*MMAX+1], deg[NMAX+1], nsol;
static int stop;
int main()
{
int n, m, u, v, i;
struct stk s;
freopen("ciclueuler.in", "r", stdin);
freopen("ciclueuler.out", "w", stdout);
scanf("%d %d", &n, &m);
for (i = 1; i <= m; i++) {
scanf("%d %d", &u, &v);
edges[2*i].v = v;
edges[2*i].n = adj[u];
edges[2*i].p = 2*i+1;
adj[u] = 2*i;
deg[u]++;
if (u != v) {
edges[2*i+1].v = u;
edges[2*i+1].n = adj[v];
edges[2*i+1].p = 2*i;
adj[v] = 2*i+1;
deg[v]++;
} else {
deg[u]++;
}
}
for (v = 1; v <= n; v++) {
if (deg[v] % 2) {
puts("-1");
return 0;
}
}
stack[stop].v = 1;
stack[stop].i = 0;
stop++;
while (stop > 0) {
s = stack[stop-1];
for (s.i = s.i == 0 ? adj[s.v] : edges[s.i].n; s.i != 0; s.i = edges[s.i].n) {
if (!deleted[s.i]) {
deleted[s.i] = 1;
deleted[edges[s.i].p] = 1;
stack[stop].v = edges[s.i].v;
stack[stop].i = 0;
stop++;
break;
}
}
if (s.i == 0) {
stop--;
sol[nsol++] = s.v;
}
}
for (i = 0; i < nsol - 1; i++) {
printf("%d ", sol[i]);
}
return 0;
}