Cod sursa(job #2830042)

Utilizator Stefan_DomuncoStefan Domunco Stefan_Domunco Data 9 ianuarie 2022 13:42:50
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.51 kb
#include <bits/stdc++.h>

using namespace std;

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

const int NMAX = 1e5 + 5;
vector <int> g[NMAX];
vector < pair <int, int> > muchii;
vector <bool> exist;
vector <int> sol;
int n, m;

inline void citire()
{
    fin >> n >> m;
    int i, a, b;

    for(i = 1; i <= m; ++i)
    {
        fin >> a >> b;
        muchii.push_back({a, b});
        exist.push_back(true);
        g[a].push_back(muchii.size() - 1);
        g[b].push_back(muchii.size() - 1);
    }
}

inline bool checkEuler()
{
    int i;

    for(i = 1; i <= n; ++i)
        if(g[i].size() % 2 == 1)
            return false;

    return true;
}

void fleury()
{
    stack <int> stiva;
    int aux, topp;
    stiva.push(1);
    while(!stiva.empty())
    {
        topp = stiva.top();

        if(g[topp].size() == 0)
        {
            sol.push_back(topp);
            stiva.pop();
        }
        else
        {
            int aux = g[topp].back();
            g[topp].pop_back();

            if(exist[aux] == true)
            {
                exist[aux] = false;
                stiva.push(muchii[aux].first ^ muchii[aux].second ^ topp);
            }
        }
    }
}

void afis()
{
    int i;
    for(i = 0; i < sol.size() - 1; ++i)
        fout << sol[i] << ' ';
}

int main()
{
    citire();

    if(checkEuler() == false)
    {
        fout << "-1";
        return 0;
    }

    fleury();
    afis();
    return 0;
}