Cod sursa(job #2820802)

Utilizator andreinovaNacu Andrei Emilian andreinova Data 21 decembrie 2021 16:52:04
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.46 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <stack>
#include <algorithm>
#include <climits>

#define MAX 100001
#define MAXCTC 500001
#define dijMax 50001
#define MAXbf  1001
#define MAXapm 2001
#define MAXmtrx  101

using namespace std;

ifstream ineuler("ciclueuler.in");
ofstream outeuler("ciclueuler.out");

class Graf
{
    int NrNoduri;

public:
    vector<int> Adiacenta[MAX];

    Graf(int NrNoduri);

    void AdaugaMuchie(int nod, int nodConectat);
    void AdaugaMUchieNeorientat(int nod, int nodConectat);

    vector<int> Euler(int nod, bool Vizitat[MAX], vector<pair<int,int>> AdiacentaEuler[MAX]);

};

//ADAUGARE MUCHII
Graf::Graf(int NrNoduri)
{
    this->NrNoduri = NrNoduri;
}
void Graf::AdaugaMuchie(int nod, int nodConectat)
{
    Adiacenta[nod].push_back(nodConectat);
}

void Graf::AdaugaMUchieNeorientat(int nod, int nodConectat)
{
    Adiacenta[nod].push_back(nodConectat);
    Adiacenta[nodConectat].push_back(nod);
}

vector<int> Graf::Euler(int nod, bool Vizitat[MAXCTC], vector<pair<int,int>> AdiacentaEuler[MAX])
{
    vector<int> Raspuns;

    stack<int> Stiva;
    Stiva.push(nod);

    while(!Stiva.empty())
    {
        nod = Stiva.top();

        if(!AdiacentaEuler[nod].empty())
        {
            int ordine = AdiacentaEuler[nod].back().first;
            int vecin = AdiacentaEuler[nod].back().second;
            AdiacentaEuler[nod].pop_back();

            if(!Vizitat[ordine])
            {
                Vizitat[ordine] = 1;
                Stiva.push(vecin);
            }
        }

        else
        {
            Raspuns.push_back(nod);
            Stiva.pop();
        }

    }

    return Raspuns;
}

int main()
{
    int N, M;
    ineuler >> N >> M;
    Graf g(N);

    int nod1, nod2;
    vector<pair<int,int>> AdiacentaEuler[MAX];
    for(int i = 0; i < M; i++)
    {
        ineuler >> nod1 >> nod2;
        AdiacentaEuler[nod1].push_back(make_pair(i, nod2));
        AdiacentaEuler[nod2].push_back(make_pair(i, nod1));
    }

    bool Vizitat[MAXCTC] = {0};
    vector<int> Raspuns;

    for(int i = 0; i <= N; i++)
    {
        if(AdiacentaEuler[i].size() & 1)
        {
            outeuler << "-1";
            return 0;

        }
    }

    Raspuns = g.Euler(1, Vizitat, AdiacentaEuler);

    for(int i = 0; i < Raspuns.size() - 1; i++)
        outeuler << Raspuns[i] << " ";

    return 0;
}