Pagini recente » Cod sursa (job #811174) | Cod sursa (job #1137332) | Cod sursa (job #2152931) | Cod sursa (job #215731) | Cod sursa (job #2932924)
#include <bits/stdc++.h>
#define NR_ARCHES 500002
using namespace std;
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");
int n,m;
vector<int> G[NR_ARCHES], L;// G- vector in care salvez toate muchiile din care face parte un varf
//L- vector in care salvez lantul eulerian
vector<pair<int, int>> M;// lista de muchii
vector<bool> elim;//vector in care salvez daca am taiat o muchie sau nu
//MOD DE FUNCTIONARE
//salvez muchiile si pentru fiecare varf sa vad care sunt muchiile din care face parte
// introduc o stiva in care sa introduc varfurile pe masura ce ajung la ele
// pentru varful din varful stivei trec prin muchiile din care face parte si adaug celalalt varf a acelei muchii
// va semana cu o parcurgere dfs
//
void eulerian() {
// avem ciclu eulerian cand gradul a tuturor vf-urilor este numar par
// se face verificare
for (int i = 1; i <= n; i++) {
if (G[i].size() % 2!= 0) {
fout << -1;
return;
}
}
stack<int> S;
S.push(1);// caut ciclu eulerian, nu ma intereseaza de unde incep
while (!S.empty())
{
int k = S.top();
if (G[k].size())// daca face parte din vreo muchie
{
int x = G[k].back();// o iau ca o parcurgere dfs, adica nu iau toate muchiile din care face parte un vf
G[k].pop_back();
if (!elim[x])// daca muchia nu a fost eliminata anterior
{
elim[x] = 1;// o elimin
// in stiva trebuie sa adaug celalant varf a muchiei, asa ca il caut
int p = M[x].second;
if (p == k)
p = M[x].first;
S.push(p);
}
}
else
{
L.push_back(k);// dupa ce parcurg toate elementele din el il adaug la eulerian
S.pop();// il scot de pe stiva
}
}
//cout << L.size() << "\n";
L.pop_back();
for (auto k : L)
fout << k << " ";
}
int main()
{
int i, j;
fin >> n >> m;
for(int k=1;k<=m;k++)
{
fin >> i >> j;
M.push_back({ i,j });
elim.push_back(false);// marchez toate muchiile ca netaiate
G[i].push_back(M.size() - 1);// face parte din a x-a muchie
G[j].push_back(M.size() - 1);
}
eulerian();
return 0;
}