Cod sursa(job #1376237)

Utilizator darrenRares Buhai darren Data 5 martie 2015 16:40:13
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include <cstring>
#include <fstream>
#include <algorithm>
#include <vector>

using namespace std;

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

int main()
{
    ifstream fin("ciclueuler.in");
    ofstream fout("ciclueuler.out");

    fin >> N >> M;
    for (int i = 1; i <= M; ++i)
    {
        fin >> E1[i] >> E2[i];
        V[E1[i]].push_back(i);
        V[E2[i]].push_back(i);
        ++D[E1[i]];
        ++D[E2[i]];
    }

    for (int i = 1; i <= N; ++i)
        if (D[i] % 2 != 0)
        {
            fout << -1 << '\n';
            fin.close();
            fout.close();
            return 0;
        }

    ST[++ST[0]] = 1;
    while (ST[0])
    {
        int now = ST[ST[0]];

        bool any = false;
        for (; rem[now] < int(V[now].size()); ++rem[now])
            if (!S[V[now][rem[now]]])
            {
                any = true;
                S[V[now][rem[now]]] = true;

                if (E1[V[now][rem[now]]] == now)
                    ST[++ST[0]] = E2[V[now][rem[now]]];
                else
                    ST[++ST[0]] = E1[V[now][rem[now]]];
                ++rem[now];

                break;
            }

        if (!any)
        {
            R[++R[0]] = now;
            --ST[0];
        }
    }

    if (R[0] != M + 1)
        fout << -1 << '\n';
    else
    {
        for (int i = 1; i <= M; ++i)
            fout << R[i] << ' ';
        fout << '\n';
    }

    fin.close();
    fout.close();
}