Cod sursa(job #3188290)

Utilizator AlessiaFrunzaAlessia Frunza AlessiaFrunza Data 2 ianuarie 2024 16:24:14
Problema Ciclu Eulerian Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.78 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <stack>
#include <algorithm>

using namespace std;

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

vector<pair<int, int>> muchii_sterse;

void sterge_muchie(int u, int v) {
    muchii_sterse.push_back({min(u, v), max(u, v)});
}

bool este_muchie_stearsa(int u, int v) {
    return (find(muchii_sterse.begin(), muchii_sterse.end(), make_pair(min(u, v), max(u, v))) != muchii_sterse.end());
}

vector<int> gaseste_ciclu_eulerian(int nod_start, int numar_noduri, vector<vector<int>>& lista_vecini) {
    vector<int> ciclu;
    stack<int> stiva;

    stiva.push(nod_start);

    while (!stiva.empty()) {
        int nod = stiva.top();
        if (!lista_vecini[nod].empty()) {
            int vecin = lista_vecini[nod].back();
            lista_vecini[nod].pop_back();
            if (!este_muchie_stearsa(nod, vecin)) {
                sterge_muchie(nod, vecin);
                stiva.push(vecin);
            }
        } else {
            ciclu.push_back(nod);
            stiva.pop();
        }
    }

    return ciclu;
}

int main() {
    int numar_noduri, numar_muchii;
    fin >> numar_noduri >> numar_muchii;
    vector<vector<int>> lista_vecini(numar_noduri + 1);

    for (int i = 0; i < numar_muchii; i++) {
        int nod1, nod2;
        fin >> nod1 >> nod2;
        lista_vecini[nod1].push_back(nod2);
        lista_vecini[nod2].push_back(nod1);
    }

    for (int i = 1; i <= numar_noduri; i++) {
        if (lista_vecini[i].size() % 2 == 1) {
            fout << "-1" << endl;
            return 0;
        }
    }

    vector<int> ciclu_eulerian = gaseste_ciclu_eulerian(1, numar_noduri, lista_vecini);

    for (int i = 0; i < ciclu_eulerian.size(); i++) {
        fout << ciclu_eulerian[i] << " ";
    }

    return 0;
}