Cod sursa(job #2803286)

Utilizator BriannaBrianna Stan Brianna Data 19 noiembrie 2021 19:02:28
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.66 kb
#include <fstream>
#include <bitset>
#include <stack>
#include <vector>

using namespace std;

const int N = 1e5;
const int M = 5e5;

pair<int, int> e[M];
bitset <M> sters;
vector <int> a[N+1], sol;
stack<int> stiva;
int poz[N+1], n, m;

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

int caut_muchie(int x)
{
    for (int i = poz[x]; i < a[x].size(); i++)
    {
        if (!sters[a[x][i]])
        {
            poz[x] = i + 1;
            return a[x][i];
        }
    }
    return -1;
}

int main()
{
   ifstream in("ciclueuler.in");
   ofstream out("ciclueuler.out");
    in >> n >> m;
    for (int i = 0; i < m; i++)
    {
        int x, y;
        in >> x >> y;
        e[i] = {x, y};
        a[x].push_back(i);
        a[y].push_back(i);
    }

    if (!toate_gradele_pare())
    {
        out << -1;
        return 0;
    }
    stiva.push(1);
    while (!stiva.empty())
    {
        int x = stiva.top();
        int muchie = caut_muchie(x);
        if (muchie == -1)
        {
            stiva.pop();
            if (!stiva.empty())
            {
                //out << x << " ";
                sol.push_back(x);
            }
        }
        else
        {
            int y = e[muchie].first + e[muchie].second - x;//nu stii care e primul si care al doilea ca e neorientat
            stiva.push(y);
            sters[muchie] = 1;
        }
    }
    if (sol.size() < m)///daca are mai multe cicluri disjuncte
    {
        out << -1;
    }
    else
    {
        for (auto x: sol)
        {
            out << x << " ";
        }
    }

    return 0;
}