Cod sursa(job #2072986)

Utilizator calin1Serban Calin calin1 Data 22 noiembrie 2017 16:12:55
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.75 kb
#include <iostream>
#include <cstdio>
#include <bitset>
#include <stack>
#include <vector>
#define N 100005
#define M 500005

using namespace std;

int n, m;

vector <int> G[N];

pair <int, int> lista[M];

stack <int> s;

bitset <M> viz;

vector <int> de_afis;

int verificare()
{
    for(int i = 1 ; i <= n ; ++i)
    {
        if(G[i].size() % 2)
        {
            return 0;
        }
    }

    return 1;
}

void afisare()
{
    int l = de_afis.size();

    for(int i = 0 ; i < l ; ++i)
    {
        printf("%d ", de_afis[i]);
    }
}

void solve()
{
    if(!verificare())
    {
        printf("-1");

        return;
    }

    s.push(1);

    int nod, indice;

    while(!s.empty())
    {
        nod = s.top();

        if(!G[nod].size())
        {
            s.pop();

            de_afis.push_back(nod);
        }
        else
        {
            indice = G[nod].back();

            G[nod].pop_back();

            if(viz[indice] == true)
            {
                continue;
            }

            viz[indice] = true;

            if(nod == lista[indice].first)
            {
                s.push(lista[indice].second);
            }
            else
            {
                s.push(lista[indice].first);
            }
        }
    }

    afisare();
}

void citire()
{
    scanf("%d %d\n", &n, &m);

    for(int i = 1 ; i <= m ; ++i)
    {
        scanf("%d %d\n", &lista[i].first, &lista[i].second);

        G[lista[i].first].push_back(i);
        G[lista[i].second].push_back(i);

    }

    solve();
}

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

    citire();

    return 0;
}