Cod sursa(job #2814196)

Utilizator amalia.gemanGeman Aamalia amalia.geman Data 7 decembrie 2021 18:39:37
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.67 kb
#include <bits/stdc++.h>
#define NMax 100001
#define NMax2 500005
using namespace std;

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


class graf
{
    int nrNoduri, nrMuchii;
    bool orientat;

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

    // Ciclu Eulerian
    void Ciclu_Eulerian();
    void Euler(int s, bool viz[NMax2], 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[NMax2], 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[NMax2] = {0};
    int ct = 0;
    vector<int> Sol;

    Euler(1, viz, ct, Sol);

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



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

    return 0;
}