Cod sursa(job #2822150)

Utilizator catarau.bianca.Bianca Catarau catarau.bianca. Data 23 decembrie 2021 17:18:18
Problema Ciclu Eulerian Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.3 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <stack>

using namespace std;

ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");

class graf{
private:
    int n, m;
    bool vizitat[100005];
    vector < pair<int,int> > v[100005];

public:
    graf(int n, int m); // constructor
    void CicluEuler();
    void Euler(int Start);
    void dfs(int a);
};

// constructor
graf :: graf(int n, int m)
{
    this->n = n;
    this->m = m;
}
void graf::dfs(int a)
{
    vizitat[a]=true;
    for(auto x: v[a])
    {
        if(vizitat[x.first]==false)
            dfs(x.first);
    }
}
void graf::Euler(int s)
{
    bool vizitat[500005];
    vector<int> rezultat;  //stocam rez final
    vector<int> vect; //dam push_back elem cu care urm sa lucram
    vect.push_back(s);      //adaugam nod start
    while (!vect.empty())     //cat timp mai avem elem in vect
    {
        int curent=vect.back(); //noteam el curent
        if (!v[curent].empty()) //daca mai are noduri la care se ajunge pornind din el
        {
            int urm=v[curent].back().first;
            int nr=v[curent].back().second;
            v[curent].pop_back(); //stergem elementul din vector
            if (!vizitat[nr])    //daca la muchia cu nr respectiv nu s-a ajuns inca
            {
                vizitat[nr]=true;     //marcam vizitata si o adaugam in vect de prelucrare
                vect.push_back(urm);
            }
        }
        else
        {
            vect.pop_back();        //cand se termina elem stergem elem pe care l-am lucrat
            rezultat.push_back(curent); //il adaugam in vect final
        }
    }
        for (size_t i=0; i<rezultat.size()-1; i++)
            g <<rezultat[i]<<" ";
}

void graf::CicluEuler()
{
    int x, y, grd[100005];
    bool vizitat[100005];
    for (int i=1; i<=m; i++)
    {
        f>>x>>y;
        v[x].push_back(make_pair(y,i));
        v[y].push_back(make_pair(x,i));
        grd[x]++;//gradul lui x
        grd[y]++;//gradul lui y
    }

    for ( int i=0; i<=n; i++ )
        if ( grd[i]%2==1 )
        {
            g << "-1";
            return;
        }
    Euler(1);
}


int main()
{
    int n, m;
    f >> n >> m;
    graf G(n, m);
    G.CicluEuler();
    return 0;
}