Pagini recente » Cod sursa (job #1924612) | Cod sursa (job #2229294) | Cod sursa (job #2246126) | Cod sursa (job #214401) | Cod sursa (job #269124)
Cod sursa(job #269124)
#include <cstdio>
#include <vector>
using namespace std;
typedef struct {
int x, y;
} Edge;
Edge E[500000];
bool used[500000];
vector<int> G[100001];
int k[100001];
int C[500001];
int NC;
int S[500001];
void cicluri(int u) {
while (true) {
for (; (k[u] < (int)G[u].size()) && used[G[u][k[u]]]; ++k[u])
;
if (k[u] >= (int)G[u].size())
break;
used[G[u][k[u]]] = true;
if (E[G[u][k[u]]].x == u)
cicluri(E[G[u][k[u]]].y);
else
cicluri(E[G[u][k[u]]].x);
}
C[NC++] = u;
//printf("%d ", u);
}
void cicluri2(int u) {
int se = 0;
S[se++] = u;
while (se > 0) {
u = S[se-1];
for (; (k[u] < (int)G[u].size()) && used[G[u][k[u]]]; ++k[u])
;
if (k[u] >= (int)G[u].size()) {
C[NC++] = u;
--se;
continue;
}
used[G[u][k[u]]] = true;
if (E[G[u][k[u]]].x == u)
S[se++] = E[G[u][k[u]]].y;
else
S[se++] = E[G[u][k[u]]].x;
}
}
int main(int argc, char *argv[]) {
int N, M, i;
FILE *fi = fopen("ciclueuler.in", "r");
fscanf(fi, "%d %d", &N, &M);
for (i = 0; i < M; ++i) {
fscanf(fi, "%d %d", &E[i].x, &E[i].y);
G[E[i].x].push_back(i);
G[E[i].y].push_back(i);
}
fclose(fi);
/*for (i = 0; i < M; ++i)
printf("%d - %d\n", E[i].x, E[i].y);
printf("\n");*/
cicluri2(1);
//printf("\n");
FILE *fo = fopen("ciclueuler.out", "w");
if (NC != M+1) {
fprintf(fo, "-1\n");
} else {
for (i = 0; i < NC; ++i)
fprintf(fo, "%d ", C[i]);
fprintf(fo, "\n");
}
fclose(fo);
return 0;
}