Pagini recente » Cod sursa (job #1134662) | Cod sursa (job #2830318) | Cod sursa (job #2274555) | Cod sursa (job #316319) | Cod sursa (job #1995974)
#include <cstdio>
#include <ctype.h>
const int MAX_N = 100000;
const int MAX_M = 500000;
const int BUFF = 4096;
bool viz[MAX_M];
int mc[1+2*MAX_M], next[1+2*MAX_M], last[1+MAX_N], idmc[1+2*MAX_M], grad[1+MAX_N];
int top = 0;
int st[1+MAX_M];
int buff = BUFF - 1;
char buftea[BUFF];
char getch(FILE *fin) {
buff++;
if(buff == BUFF) {
buff = 0;
fread(buftea, 1, BUFF, fin);
}
return buftea[buff];
}
int getnr(FILE *fin) {
int nr = 0;
char ch = getch(fin);
while(!isdigit(ch))
ch = getch(fin);
while(isdigit(ch)) {
nr = nr * 10 + ch - '0';
ch = getch(fin);
}
return nr;
}
void addM(int a, int b, int id, int i) {
next[id] = last[a];
last[a] = id;
mc[id] = b;
idmc[id] = i;
}
int main() {
int n, m, a, b, scrise;
bool ok = true;
FILE *fin = fopen("ciclueuler.in", "r");
n = getnr(fin);
m = getnr(fin);
for(int i = 0; i < m; ++i) {
a = getnr(fin);
b = getnr(fin);
grad[a]++;
grad[b]++;
addM(a, b, i * 2 + 1, i);
addM(b, a, i * 2 + 2, i);
}
fclose(fin);
for(int i = 0; i < n; ++i)
if(grad[i] % 2 == 1)
ok = false;
FILE *fout = fopen("ciclueuler.out", "w");
if(ok) {
scrise = 0;
st[top++] = 1;
while(top > 0) {
int nod = st[top - 1];
int i = last[nod], id = idmc[i];
if(last[nod] == 0) {
if(scrise < m) {
fprintf(fout, "%d ", nod);
++scrise;
}
--top;
} else if(viz[id] == true)
last[nod] = next[i];
else {
viz[id] = true;
st[top++] = mc[i];
}
}
} else
fprintf(fout, "-1");
fclose(fout);
return 0;
}