Cod sursa(job #2814194)

Utilizator amalia.gemanGeman Aamalia amalia.geman Data 7 decembrie 2021 18:37:54
Problema Ciclu Eulerian Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.69 kb
#include <bits/stdc++.h>
#define NMax 100001

using namespace std;

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


class graf
{
    int nrNoduri, nrMuchii;
    bool orientat;
    vector <int> gr[NMax]; // liste de adiacenta ale grafului


public:
    graf(int n, int m, bool o); // constructor

    // Ciclu Eulerian
    void Ciclu_Eulerian();
    void Euler(int s, bool viz[NMax], int &ct, vector<int>&Sol);
};


int N, M;


vector<pair<int,int>> muchii[NMax];

graf :: graf(int n, int m, bool o)
{
    nrNoduri = n;
    nrMuchii = m;
    orientat = o;
}

void graf :: Euler(int s, bool viz[NMax], int &ct, vector<int>&Sol)
{
    while (!muchii[s].empty())
    {
        int vecin = muchii[s].back().second; // nod vecin
        int muchie = muchii[s].back().first; // index muchie
        muchii[s].pop_back();

        if(viz[muchie] == 0)
        {
            viz[muchie] = 1;
            Euler(vecin, viz, ct, Sol);
        }
    }
    ct++;
    Sol.push_back(s);
}

void graf :: Ciclu_Eulerian()
{
    for (int i = 1; i <= nrMuchii; ++i) // citire muchii
    {
        int x, y;
        fin >> x >> y;
        muchii[x].push_back({i, y});
        muchii[y].push_back({i, x});
    }

    for (int i = 1; i <= nrNoduri; ++i) // verificam gradul fiecarui nod sa fie par
        if (muchii[i].size() % 2)
        {
            fout << "-1";
            return;
        }

    bool viz[NMax] = {0};
    int ct = 0;
    vector<int> Sol;

    Euler(1, viz, ct, Sol);

    for (auto i : Sol)
        fout << i << " ";
}



int main()
{
    fin >> N >> M;
    graf G(N, M, 0);
    G.Ciclu_Eulerian();

    return 0;
}