Pagini recente » Cod sursa (job #800439) | Cod sursa (job #2320109) | Cod sursa (job #1215370) | Cod sursa (job #859101) | Cod sursa (job #1870284)
#include <cstdio>
using namespace std;
FILE *f, *g;
int n, m;
int k;
int rez;
int v[1000001];
int lst[100001];
int nd[100001];
int urm[1000001];
int ant[1000001];
int nod[1000001];
void add(int a, int b)
{
k ++;
nod[k] = b;
urm[k] = lst[a];
ant[lst[a]] = k;
lst[a] = k;
nd[a] ++;
}
void readFile()
{
f = fopen("ciclueuler.in", "r");
fscanf(f, "%d%d", &n, &m);
int i;
int a, b;
for(i = 1; i <= m; i ++)
{
fscanf(f, "%d%d", &a, &b);
add(a, b);
add(b, a);
}
fclose(f);
}
int primulNod(int x)
{
int rez = 0, p;
nd[x] --;
for(p = lst[x]; p != 0 && (rez == 0); p = urm[p])
{
if(nod[p] != -1)
{
rez = nod[p];
nod[p] = -1;
}
}
return rez;
}
void sterge(int a, int b)
{
int p;
nd[a] --;
for(p = lst[a]; p != 0; p = urm[p])
{
if(nod[p] == b)
{
nod[p] = -1;
return;
}
}
}
int stk[1000001];
void solve()
{
int i;
for(i = 1; i <= n && (rez != -1); i ++)
{
if(nd[i] % 2 == 1 || nd[i] == 0)
rez = -1;
}
int x, y;
if(rez == 0)
{
int stkLen = 0;
stk[++ stkLen] = 1;
while(stkLen > 0)
{
x = stk[stkLen];
//printf("%d %d\n", x, stkLen);
while(nd[x] > 0)
{
y = primulNod(x);
sterge(y, x);
stk[++ stkLen] = y;
x = y;
}
//printf("%d\n", rez);
v[++ rez] = stk[stkLen --];
}
}
}
void printFile()
{
g = fopen("ciclueuler.out", "w");
if(rez == -1)
fprintf(g, "%d\n", rez);
else
{
int i;
for(i = rez; i >= 1; i --)
fprintf(g, "%d ", v[i]);
fprintf(g, "\n");
}
fclose(g);
}
int main()
{
readFile();
solve();
printFile();
return 0;
}