Cod sursa(job #2932924)

Utilizator mati.coldea@gmail.comMatei Coldea [email protected] Data 4 noiembrie 2022 11:50:22
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.37 kb
#include <bits/stdc++.h>
#define NR_ARCHES 500002
using namespace std;

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

int n,m;

vector<int> G[NR_ARCHES], L;// G- vector in care salvez toate muchiile din care face parte un varf
//L- vector in care salvez lantul eulerian
vector<pair<int, int>> M;// lista de muchii
vector<bool> elim;//vector in care salvez daca am taiat o muchie sau nu


//MOD DE FUNCTIONARE
//salvez muchiile si pentru fiecare varf sa vad care sunt muchiile din care face parte 
// introduc o stiva in care sa introduc varfurile pe masura ce ajung la ele
// pentru varful din varful stivei trec prin muchiile din care face parte si adaug celalalt varf a acelei muchii
// va semana cu o parcurgere dfs  
//



void eulerian() {
    // avem ciclu eulerian cand gradul a tuturor vf-urilor este numar par
  // se face verificare

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


    stack<int> S;
    S.push(1);// caut ciclu eulerian, nu ma intereseaza de unde incep
    while (!S.empty())
    {
        int k = S.top();
        if (G[k].size())// daca face parte din vreo muchie
        {
            int x = G[k].back();// o iau ca o parcurgere dfs, adica nu iau toate muchiile din care face parte un vf
            G[k].pop_back();
            if (!elim[x])// daca muchia nu a fost eliminata anterior
            {
                elim[x] = 1;// o elimin

                // in stiva trebuie sa adaug celalant varf a muchiei, asa ca il caut 
                int p = M[x].second;
                if (p == k)
                    p = M[x].first;
                S.push(p);
            }
        }
        else
        {

            L.push_back(k);// dupa ce parcurg toate elementele din el il adaug la eulerian 
            S.pop();// il scot de pe stiva
        }

    }

    //cout << L.size() << "\n";
    L.pop_back();
    for (auto k : L)
        fout << k << " ";

}


int main()
{
    int i, j;
    fin >> n >> m;
    for(int k=1;k<=m;k++)
    {
        fin >> i >> j;
        M.push_back({ i,j });
        elim.push_back(false);// marchez toate muchiile ca netaiate
        G[i].push_back(M.size() - 1);// face parte din a x-a muchie
        G[j].push_back(M.size() - 1);
    }

    eulerian();

    return 0;
}