Cod sursa(job #2870641)

Utilizator Stefan_DomuncoStefan Domunco Stefan_Domunco Data 12 martie 2022 14:44:09
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.62 kb
#include <bits/stdc++.h>
#define FOR(i, st, dr) for(i = st; i <= dr; i++)
#define pii pair<int,int>
//#define fin cin
//#define fout cout

using namespace std;

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

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

void citire()
{
    fin >> n >> m;

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

bool check()
{
    int i;
    for(i = 1; i <= n; ++i)
        if(g[i].size() % 2 == 1)
            return false;
    return true;
}

void fleury()
{
    int top;
    stack <int> stiva;
    stiva.push(1);

    while(!stiva.empty())
    {
        top = stiva.top();

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

            if(exist[ax] == true)
            {
                exist[ax] = false;
                ax = muchie[ax].first ^ muchie[ax].second ^ top;
                stiva.push(ax);
            }

        }
    }
}


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

int main()
{
    citire();

    if(check() == false)
    {
        fout << "-1";
        exit(0);
    }

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