Pagini recente » Cod sursa (job #1389587) | Cod sursa (job #641981) | Cod sursa (job #923681) | Cod sursa (job #3128948) | Cod sursa (job #3188286)
#include <iostream>
#include <fstream>
#include <vector>
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;
}