Cod sursa(job #893335)

Utilizator AndreiRSStatescu Andrei Rares AndreiRS Data 26 februarie 2013 15:02:23
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include <fstream>
#include <vector>
#include <stack>
#include <algorithm>
using namespace std;

ifstream fi ("ciclueuler.in");
ofstream fo ("ciclueuler.out");

const int dim = 100005;
int N, M, IV[dim], viz[5 * dim], R[5 * dim];
vector < pair <int, int> > V[dim];
stack <int> S;

void cit ()
{
    fi >> N >> M;
    for (int i = 1, a, b; i <= M; i++)
    {
        fi >> a >> b;

        V[a].push_back (make_pair (b, i));
        V[b].push_back (make_pair (a, i));
    }
}

void dfs (int n)
{
    IV[n] = 1;
    for (int i = 0, f; i < V[n].size(); i++)
    {
        f = V[n][i].first;
        if (IV[f] == 0)
            dfs (f);
    }
}

bool verif ()
{
    for (int i = 1; i <= N; i++)
        if ((V[i].size() & 1) == 1)
            return 0;
    dfs (1);
    for (int i = 1; i <= N; i++)
        if (IV[i] == 0)
            return 0;
        else
            IV[i] = 0;
    return 1;
}

void rez ()
{
    int n, m, f;
    S.push (1);

    while (!S.empty())
    {
        n = S.top();
        if (IV[n] < V[n].size())
        {
            f = V[n][IV[n]].first;
            m = V[n][IV[n]].second;
            IV[n]++;

            if (viz[m] == 1)
                continue;
            viz[m] = 1;

            S.push (f);
        }
        else
        {
            R[++R[0]] = n;
            S.pop ();
        }
    }
}

void afi ()
{
    for (int i = 1; i < R[0]; i++)
        fo << R[i] << ' ';
}

int main ()
{
    cit ();
    if (verif ())
    {
        rez ();
        afi ();
    }
    else
        fo << "-1\n";
    return 0;
}