Pagini recente » Monitorul de evaluare | Cod sursa (job #3223944) | Diferente pentru implica-te/arhiva-educationala intre reviziile 155 si 223 | Cod sursa (job #3252079) | Cod sursa (job #238213)
Cod sursa(job #238213)
#include <stdio.h>
#include <assert.h>
#include <vector>
using namespace std;
#define maxn 100010
#define maxx 500010
int N, M, L, NR;
vector <int> A[maxn];
int G[maxn], w[maxn];
int X[maxx], Y[maxx];
int S[maxx], Rez[maxx];
char U[maxx];
int main()
{
freopen("ciclueuler.in", "r", stdin);
freopen("ciclueuler.out", "w", stdout);
int i, nod;
scanf("%d %d ", &N, &M);
assert(1 <= N && N <= 100000);
assert(1 <= M && M <= 500000);
for (i = 1; i <= M; i++)
{
scanf("%d %d ", &X[i], &Y[i]);
assert(1 <= X[i] && X[i] <= N);
assert(1 <= Y[i] && Y[i] <= N);
A[X[i]].push_back(i);
A[Y[i]].push_back(i);
}
for (i = 1; i <= N; i++) G[i] = A[i].size();
for (i = 1; i <= N; i++)
if (G[i]&1)
{
printf("-1\n");
return 0;
}
L = 1;
S[L] = 1;
while (L > 0)
{
nod = S[L];
for (; w[nod]<G[nod] && U[A[nod][w[nod]]]; w[nod]++);
if (w[nod] < G[nod])
{
U[A[nod][w[nod]]] = 1;
if (nod == X[A[nod][w[nod]]]) S[++L] = Y[A[nod][w[nod]]];
else S[++L] = X[A[nod][w[nod]]];
w[nod]++;
continue;
}
Rez[++NR] = S[L--];
}
if (NR <= M)
{
printf("-1\n");
return 0;
}
for (i = 1; i < NR; i++) printf("%d ", Rez[i]);
printf("\n");
return 0;
}