Cod sursa(job #1815708)

Utilizator Burbon13Burbon13 Burbon13 Data 25 noiembrie 2016 18:08:06
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <cstdio>
#include <vector>
#include <stack>

using namespace std;

const int nmx = 100002;

struct Muchie
{
    int nod1, nod2;
    bool used = 1;
} v[nmx];

int n,m,grd[nmx];
vector <int> g[nmx];
stack <int> st;

void citire()
{
    scanf("%d %d", &n, &m);
    for(int i = 1; i <= m; ++i)
    {
        scanf("%d %d", &v[i].nod1, &v[i].nod2);
        g[v[i].nod1].push_back(i);
        g[v[i].nod2].push_back(i);
        grd[v[i].nod1] ++;
        grd[v[i].nod2] ++;
    }
}

bool grade_bune()
{
    for(int i = 1; i <= n; ++i)
        if(grd[i] % 2)
            return 0;
    return 1;
}

void euler()
{
    st.push(1);
    while(not st.empty())
    {
        int nod = st.top();
        if(g[nod].size())
        {
            int mhc = g[nod].back();
            g[nod].pop_back();
            if(v[mhc].used == 1)
            {
                if(v[mhc].nod1 != nod)
                    st.push(v[mhc].nod1);
                else
                    st.push(v[mhc].nod2);
                v[mhc].used = 0;
            }
        }
        else
        {
            printf("%d ", nod);
            st.pop();
        }
    }
}

int main()
{
    freopen("eulerian.in", "r", stdin);
    freopen("eulerian.out", "w", stdout);
    citire();
    if(not grade_bune())
    {
        printf("-1\n");
        return 0;
    }
    euler();
    return 0;
}