Pagini recente » Cod sursa (job #2287577) | Cod sursa (job #280303) | Cod sursa (job #25041) | Cod sursa (job #3131277) | Cod sursa (job #373297)
Cod sursa(job #373297)
#include <stdio.h>
#include <vector>
using namespace std;
#define MAX_N 100010
#define MAX_M 500010
int n, m, t;
int ind[MAX_N], L[MAX_N], grad[MAX_N];
int use[MAX_M], Q[MAX_M], Sol[MAX_M];
struct muchie {
int p, q;
} v[MAX_M];
vector <int> edge[MAX_N];
void cit() {
freopen("ciclueuler.in", "r", stdin);
freopen("ciclueuler.out", "w", stdout);
scanf("%d %d", &n, &m);
for (int i = 1; i <= m; i++) {
scanf("%d %d", &v[i].p, &v[i].q);
edge[v[i].p].push_back(i);
edge[v[i].q].push_back(i);
L[v[i].p]++; L[v[i].q]++;
grad[v[i].p]++; grad[v[i].q]++;
}
}
void solve() {
for (int i = 1; i <= n; i++)
if (grad[i] % 2) {
printf("-1");
return;
}
Q[1] = t = 1;
while (t) {
int nod = Q[t];
for (; ind[nod] < L[nod]; ind[nod]++)
if (use[edge[nod][ind[nod]]] == 0) {
use[edge[nod][ind[nod]]] = 1;
int e = edge[nod][ind[nod]];
if (v[e].p == nod) Q[++t] = v[e].q;
else Q[++t] = v[e].p;
break;
}
if (ind[nod] == L[nod])
Sol[++Sol[0]] = Q[t--];
}
}
void write() {
for (int i = 1; i < Sol[0]; i++)
printf("%d ", Sol[i]);
printf("\n");
}
int main() {
cit();
solve();
write();
return 0;
}