Cod sursa(job #2377186)

Utilizator AurelGabrielAurel Gabriel AurelGabriel Data 8 martie 2019 22:53:18
Problema Ciclu Eulerian Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <fstream>
#include <unordered_set>
#include <stack>

using namespace std;

struct graph
{
    unordered_multiset<int>* adj;
    int s;

    graph(const int n)
    {
        adj = new unordered_multiset<int>[n];
        s = n;
    }

    void add_edge(const int u, const int v)
    {
        adj[u].insert(v);
        adj[v].insert(u);
    }
};

stack<int> path;
stack<int> st;
void euler_path(graph& g)
{
    st.push(0);
    while(!st.empty())
    {
        int u = st.top();
        if(g.adj[u].empty())
        {
            path.push(st.top());
            st.pop();
        }
        else
        {
            int v = *g.adj[u].begin();
            st.push(v);
            g.adj[u].erase(g.adj[u].find(v));
            g.adj[v].erase(g.adj[v].find(u));

        }
    }
}



int main()
{
    ifstream f("ciclueuler.in");
    ofstream g("ciclueuler.out");

    int n, m;
    f >> n >> m;
    graph gr(n);
    for(int i= 0; i < m; i++)
    {
        int u, v;
        f >> u >> v;
        u--; v--;
        gr.add_edge(u,v);
    }

    for(int i = 0; i < n; i++)
        if(gr.adj[i].size()%2==1)
        {
            g << -1;
            return 0;
        }

    euler_path(gr);

    path.pop();
    while(!path.empty())
    {
        g << path.top()+1 << ' ';
        path.pop();
    }


    return 0;
}