/*** Řešení prohledáváním do hloubky ***/ #include #include #include using namespace std; #define MAXN 1000000 #define MAXM 10000000 /* Počet vrcholů a hran. */ int N, M; /* Seznam hran grafu. */ struct edge { int u, v; } G[MAXM]; /* Sousedi vrcholu x jsou E[V[x]], E[V[x] + 1], ..., E[V[x+1] - 1] */ int V[MAXN+1]; int E[2*MAXM]; /* Pomocné proměnné pro prohledávání do hloubky. */ int used[MAXN]; int neigh[MAXN]; int camefrom[MAXN]; int main() { /* Načteme graf a spočítáme si seznamy sousedů do pole E. */ scanf("%d%d", &N, &M); for (int i = 0; i < M; i++) { scanf("%d%d", &G[i].u, &G[i].v); V[--G[i].u]++; V[--G[i].v]++; } for (int i = 0; i < N; i++) V[i+1] += V[i]; for (int i = 0; i < M; i++) { E[--V[G[i].u]] = G[i].v; E[--V[G[i].v]] = G[i].u; } for (int i = 0; i < N; i++) { neigh[i] = V[i]; } /* Prohledávání do hloubky. */ camefrom[0] = -1; int curvert = 0; while (curvert != -1) { used[curvert]++; if (neigh[curvert] < V[curvert+1]) { if (used[E[neigh[curvert]]] == 0) { camefrom[E[neigh[curvert]]] = curvert; neigh[curvert]++; curvert = E[neigh[curvert]-1]; } else { neigh[curvert]++; } } else { printf("%d%s", curvert + 1, (curvert == 0) ? "\n" : " "); curvert = camefrom[curvert]; } } return 0; }