Cod sursa(job #3361175)

Utilizator nicoleta_iancuIancu Nicoleta nicoleta_iancu Data 21 iulie 2026 15:18:50
Problema Ciclu Eulerian Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.56 kb

#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;

ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");
vector<vector<pair<int,int>>>graph;
//graph[i].first=j=nodul vecin lui j
//graph[i].second=indicele muchiei
vector<bool>vizm;//pe muchii
vector<int>circuitEuler;//circuit eulerian
void calcEuler(int nodCrt) {

    for (int i = graph[nodCrt].size()-1; i >= 0; --i) {
        int idxMuchie = graph[nodCrt][i].second;
        if (!vizm[idxMuchie]) {
            vizm[idxMuchie] = 1;
            calcEuler(graph[nodCrt][i].first);
        }
    }
    circuitEuler.push_back(nodCrt);
}
vector<bool>vizn;//pe noduri
void DFS(int nodCrt) {
    vizn[nodCrt] = 1;
    for (auto i : graph[nodCrt]) {
        if (!vizn[i.first]) {
            DFS(i.first);
        }
    }
}
bool checkEuler(int &n) {
  //  DFS(1);
    for (int i = 1; i <= n; ++i) {
        if (graph[i].size() % 2 == 1) {
            return false;
        }
    }
    return true;
}
int main()
{
    int n,m;
    fin >> n>>m;
    graph.resize(n+1);
    vizm.resize(m);
    vizn.resize(n+1);
    int u, v;
    for (int i = 0; i < m; ++i) {
        fin >> u >> v;
        graph[u].push_back(make_pair(v,i));
        graph[v].push_back(make_pair(u,i));
    }
    if (checkEuler(n)) {
        calcEuler(1);
        circuitEuler.pop_back();//reincepe cu primul nod
        for (auto i : circuitEuler) {
            fout << i << " ";
        }
    }
    else {
        fout << "-1";
    }
    return 0;
}
//=^..^=