Cod sursa(job #2715275)

Utilizator dimi999Dimitriu Andrei dimi999 Data 3 martie 2021 14:37:52
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
#include <fstream>
#include <vector>
#include <stack>
#include <algorithm>

using namespace std;

ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");

struct Edge
{
    int dest, poz;
};

vector <Edge> v[100005];

int entered[100005];

bool taken[500005];

int main()
{
    int N, M;

    fin >> N >> M;

    stack <int> st;

    for(int i = 1; i <= M; i++)
    {
        int x, y;

        fin >> x >> y;

        v[x].push_back({y, i});
        v[y].push_back({x, i});
    }

    st.push(1);

    vector <int> ans;

    for(int i = 1; i <= N; i++)
        if((int)v[i].size() % 2 == 1)
    {
        fout << -1 << '\n';
        return 0;
    }

    while(!st.empty())
    {
        int node = st.top();

        if(entered[node] < (int)v[node].size())
        {
            int dest = v[node][entered[node]].dest;
            int poz = v[node][entered[node]].poz;

            entered[node]++;

            if(taken[poz] == 1)
                continue;

            taken[poz] = 1;

            st.push(dest);
        }
        else
        {
            st.pop();
            ans.push_back(node);
        }
    }

    reverse(ans.begin(), ans.end());

    for(int i = 0; i < (int)ans.size() - 1; i++)
        fout << ans[i] << " ";
    return 0;
}