Cod sursa(job #2811802)

Utilizator MirunaStefaniaLupascu Miruna-Stefania MirunaStefania Data 3 decembrie 2021 09:07:42
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.49 kb
#include <bits/stdc++.h>
#define N 100001
#define M 500001

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


typedef pair < int, int > Pair; // define our pair for an easier use
 vector < Pair > graf[N]; // garf[x] = (nr_muchie, y) --> ca sa stim sa  marcam o singura data muchia ca fiind folosita
                            // graf[y] = (nr_muchie, x)
    bool eliminated[M]; //the edges that will be eliminated
    stack<int> stack_nodes;
    vector<int> euler_cicle;
int n, m;
void Euler()
{
    /*
    adăugăm pe stivă un vârf oarecare – de exemplu 1;
    cât timp stiva nu este vidă
        fie k – nodul din vârful stivei
        determinăm nodurile x adiacente cu k. Eliminăm muchia [k,x] și adăugăm nodul x pe stivă (apel recursiv)
            continuăm cu nodul situat în vârful stivei
        adăugăm nodul k într-o listă
        eliminăm nodul k din stivă
    lista construită reprezintă ciclu eulerian
    */
    ///alg Fleury: pornim de la un nod oarecare si, la fiecare pas, parcurgem o muchie a carei stergere din graf nu l-ar deconecta. Stergem muchia respectiva si,
    ///deplasandu-ne in celalalt capat al ei,continuam algoritmul in aceeasi maniera pana cand vom epuiza toate muchiile grafului. Ciclul obtinut este Eulerian.


    for(int i = 1; i <= m; ++i)
    {
        int x, y;
        fin >> x >> y;
        graf[x].push_back(make_pair(i, y));
        graf[y].push_back(make_pair(i, x));
    }

    for(int i = 1; i <= n; ++i)
        if(graf[i].size() %2 == 1)//it can't have an euler cicle
    {
        fout << -1;
        return;
    }

    stack_nodes.push(1);
    while(!stack_nodes.empty())//like a dfs
    {
        int node = stack_nodes.top();
        if(!graf[node].empty())//if it still has neighbours
        {
            Pair p = graf[node].back();
            graf[node].pop_back();

            int nr_edge = p.first;
            int vertex = p.second;

            if(!eliminated[nr_edge])
            {
                eliminated[nr_edge] = 1; //we eliminate it
                stack_nodes.push(vertex);//will continue from here
            }
        }
        else    //we can add it to the solution
        {
            stack_nodes.pop();
            euler_cicle.push_back(node);
        }
    }
    for(int i = 0; i < euler_cicle.size() - 1; ++i)
        fout << euler_cicle[i] << " ";

}
int main()
{
    fin >> n >> m;
    Euler();

  return 0;
}