Cod sursa(job #1935703)

Utilizator calin1Serban Calin calin1 Data 22 martie 2017 16:49:39
Problema Ciclu Eulerian Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <stack>
#define N 100005
#define M 500005

using namespace std;

int n, m;

vector <int> G[N];

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

stack <int> s;
stack <int> lant;

void stergere(int a, int b)
{
    vector <int>::iterator it;

    for(it = G[b].begin() ; it != G[b].end() ; ++it)
    {
        if(*it == a)
        {
            G[b].erase(it);

            return;
        }
    }
}

void euler()
{
    s.push(1);

    vector <int>::iterator it;

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

        if(!G[nod].size())
        {
            lant.push(nod);

            s.pop();
        }
        else
        {
            for(it = G[nod].begin() ; it != G[nod].end() ; ++it)
            {
                s.push(*it);

                stergere(nod, *it);

                G[nod].erase(it);

                break;
            }
        }
    }
}

void afisare()
{
    while(!lant.empty())
    {
        printf("%d ",lant.top());

        lant.pop();
    }
}

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

    int a,b;

    for(int i = 1 ; i <= m ; ++i)
    {
        scanf("%d %d\n",&a,&b);

        G[a].push_back(b);
        G[b].push_back(a);

    }

    if(!verificare())
    {
        printf("-1");
    }
    else
    {
        euler();
    }

    afisare();
}

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

    citire();

    return 0;
}