Cod sursa(job #1414164)

Utilizator ArmandNMArmand Nicolicioiu ArmandNM Data 2 aprilie 2015 13:34:22
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <fstream>
#include <vector>
#include <stack>
#include <algorithm>

const int NMAX = 100005;

using namespace std;

ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");

int N,M,x,y;
int grad[NMAX];
vector <int> v[NMAX];
stack <int> S;
bool viz[NMAX];

void DFS(int nod)
{
    viz[nod] = true;
    for (int i = 0; i < v[nod].size(); ++i)
    {
        int vecin = v[nod][i];
        if (!viz[vecin])
            DFS(vecin);
    }
}

void removeEdge(int x, int y)
{
    v[x].erase(v[x].begin());
    v[y].erase(find(v[y].begin(),v[y].end(),x));
}

void solve()
{
    S.push(1);
    while(!S.empty())
    {
        int nod = S.top();

        if (v[nod].size())
        {
            S.push(v[nod][0]);
            removeEdge(nod,v[nod][0]);
        }
        else
        {
            g << nod << " ";
            S.pop();
        }
    }
}

int main()
{
    f >> N >> M;
    for (int i = 1; i <= M; ++i)
    {
        f >> x >> y;
        v[x].push_back(y);
        v[y].push_back(x);
        grad[x]++;
        grad[y]++;
    }

    DFS(1);

    for (int i = 1; i <= N; ++i)
    {
        if (!viz[i] || grad[i]%2 != 0)
        {
            g << "-1";
            return 0;
        }
    }

    solve();

    f.close();
    g.close();
    return 0;
}