Cod sursa(job #978146)

Utilizator romircea2010FMI Trifan Mircea Mihai romircea2010 Data 27 iulie 2013 23:39:25
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.16 kb
#include <fstream>
#include <algorithm>
#include <vector>
#include <stack>

using namespace std;

bool viz[500100];
int n, m, X[500100], Y[500100], sol[500100], nsol;
vector <int> G[100010];
//stack < pair<int, vector <int>::iterator> > st;
pair<int, vector <int>::iterator> st[500010];

inline void Read()
{
    ifstream f("ciclueuler.in");
    f>>n>>m;
    int i;
    for (i=1; i<=m; i++)
    {
        f>>X[i]>>Y[i];
        G[X[i]].push_back(i);
        G[Y[i]].push_back(i);
    }
    f.close();
}

inline bool Verificare()
{
    for (int i=1; i<=n; i++)
        if (G[i].size() & 1)
            return true;
    return false;
}

inline void DFS(int nod)
{
    vector <int>::iterator it;
    for (it = G[nod].begin(); it!=G[nod].end(); it++)
    {
        if (!viz[*it])
        {
            viz[*it] = true;
            DFS(X[*it] + Y[*it] - nod);
        }
    }
    sol[++nsol] = nod;
}

inline void Solve()
{
    //DFS(1);

    vector <int>::iterator it;
    pair<int, vector <int>::iterator> aux, aux2;
    int nod, vf;
    vf = 0;
    aux.first = 1;
    aux.second = G[1].begin();
    st[++vf] = aux;
    while (vf)
    {
        aux = st[vf];
        nod = aux.first;
        it = aux.second;
        if (it == G[nod].end())
        {
            vf--;
            sol[++nsol] = nod;
        }
        else
        {
            if (!viz[*it])
            {
                viz[*it] = true;

                aux2.first = X[*it] + Y[*it] - nod;
                aux2.second = G[X[*it] + Y[*it] - nod].begin();

                it++;
                st[vf].second = it;
                st[++vf] = aux2;
            }
            else
            {
                it++;
                st[vf].second = it;
            }
        }
    }

}

inline void Write()
{
    ofstream g("ciclueuler.out");
    int i;
    for (i=1; i<=nsol; i++)
        g<<sol[i]<<" ";
    g<<"\n";
    g.close();
}

int main()
{
    Read();
    if (Verificare())
    {
        ofstream g("ciclueuler.out");
        g<<"-1\n";
        g.close();
        return 0;
    }
    Solve();
    Write();
    return 0;
}