Cod sursa(job #1166278)

Utilizator darrenRares Buhai darren Data 3 aprilie 2014 13:43:57
Problema Ciclu Eulerian Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <cstdio>
#include <algorithm>
#include <vector>

using namespace std;

int N, M;
vector<int> V[100002];
int D[100002];
int E1[500002], E2[500002];
bool is[500002];
int wh[100002], ST[500002], R[500002];

int main()
{
    freopen("ciclueuler.in", "r", stdin);
    freopen("ciclueuler.out", "w", stdout);

    scanf("%d %d", &N, &M);
    for (int i = 1; i <= M; ++i)
    {
        scanf("%d %d", &E1[i], &E2[i]);
        V[E1[i]].push_back(i);
        V[E2[i]].push_back(i);
        ++D[E1[i]];
        ++D[E2[i]];
    }

    ST[++ST[0]] = 1;
    while (ST[ST[0]])
    {
        int x = ST[ST[0]];
        if (wh[x] < int(V[x].size()))
        {
            for (; wh[x] < int(V[x].size()); ++wh[x])
                if (!is[V[x][wh[x]]])
                {
                    if (E1[V[x][wh[x]]] == x)
                        ST[++ST[0]] = E2[V[x][wh[x]]];
                    else
                        ST[++ST[0]] = E1[V[x][wh[x]]];
                    is[V[x][wh[x]]] = true;

                    ++wh[x];
                    break;
                }
        }
        else
        {
            R[++R[0]] = ST[ST[0]];
            --ST[0];
        }
    }

    for (int i = R[0]; i >= 2; --i)
        printf("%d ", R[i]);
    printf("\n");
}