Cod sursa(job #1907102)

Utilizator bt.panteaPantea Beniamin bt.pantea Data 6 martie 2017 17:49:05
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <bits/stdc++.h>
#define NMAX 100005
#define MMAX 500005
using namespace std;
ifstream f ("ciclueuler.in");
ofstream g ("ciclueuler.out");
int from[MMAX], to[MMAX], n, m;
bitset < MMAX > used(false);
vector < int > a[NMAX], sol, st;

int main()
{
    f>>n>>m;
    int cycle = 0;
    for (int x, y, i = 0; i < m; i++)
    {
        f>>x>>y;
        from[i] = x;
        to[i] = y;
        a[x].push_back(i);
        a[y].push_back(i);
        if (x != y)
        {
            cycle += (a[x].size() % 2);
            cycle -= !(a[x].size() % 2);
            cycle += (a[y].size() % 2);
            cycle -= !(a[y].size() % 2);
        }
    }

    if (cycle != 0)
    {
        g<<-1;
        return 0;
    }

    st.push_back(1);
    while (!st.empty())
    {
        int x = st.back();
        if (!a[x].empty())
        {
            int y = a[x].back();
            a[x].pop_back();
            if (!used[y])
            {
                used[y] = 1;
                int t = from[y];
                if (t == x)
                    t = to[y];
                st.push_back(t);
            }
        } else {
            st.pop_back();
            sol.push_back(x);
        }
    }
    for (int i = 0; i < sol.size() - 1; i++)
        g<<sol[i]<<' ';
    return 0;
}