Cod sursa(job #2198318)

Utilizator Narvik13Razvan Roatis Narvik13 Data 24 aprilie 2018 11:04:41
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <fstream>
#include <vector>
#include <stack>
#include <bitset>
#define MMX 500002
#define NMX 100002

using namespace std;

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

/**
Ideea generale:
Retinem muchiile si nodurile care le compun.
Astfel stergerea unei muchii se va face in O(1)
*/

class edge
{
public:
    int vert1, vert2;
};

int n,m, grad[NMX];
edge e[MMX];
vector <int> g[NMX];
stack <int> st;
bitset <MMX> viz;

void input()
{
    f >> n >> m;
    for(int i = 1; i <= m; ++i)
    {
        f >> e[i].vert1 >> e[i].vert2;
        g[e[i].vert1].push_back(i);
        g[e[i].vert2].push_back(i);
        grad[e[i].vert1] ++;
        grad[e[i].vert2] ++;
    }
}

void euler()
{
    st.push(1);
    viz.set();
    int i_edge, de_adaugat;
    while(not st.empty())
    {
        int nod = st.top();
        if(g[nod].size())
        {
            i_edge = g[nod].back();
            g[nod].pop_back();

            if(viz[i_edge] == false)
                continue;
            viz[i_edge] = false;

            de_adaugat = (e[i_edge].vert1 == nod ? e[i_edge].vert2 : e[i_edge].vert1);
            st.push(de_adaugat);
        }
        else
        {
            o << nod << ' ';
            st.pop();
        }
    }
    o << '\n';
}

int main()
{
    input();
    for(int i = 1; i <= n; ++i)
        if(grad[i] % 2)
        {
            o << -1 << '\n';
            return 0;
        }
    euler();
    return 0;
}