Pagini recente » Cod sursa (job #962708) | Cod sursa (job #3212065) | Cod sursa (job #2338508) | Cod sursa (job #342315) | Cod sursa (job #2576705)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");
int n, m, i, a, b, grad[100002], nod, vecin, nr;
vector<pair<int, int> > v[100002];
int stiva[500003];
bitset<500005> f;
int main(){
fin>>n>>m;
for(i=1;i<=m;i++){
fin>>a>>b;
v[a].push_back({b, i});
v[b].push_back({a, i});
grad[a]++;
grad[b]++;
}
for(i=1;i<=n;i++)
if(grad[a] % 2 == 1){
fout<<-1;
return 0;
}
nr = 1;
stiva[1] = 1;
while(nr){
/// practic, stiva este a unui dfs care incepe sa rezolve un nod, dar apoi trece la urmatorul
nod = stiva[nr];
if(grad[nod] == 0){
/// daca am terminat toti ciclii care il contin pe nod,
/// atunci nod se poate odihni in pace, in sfarsit
/// si il scot din stiva, afisandu-l
if(nr > 1)
fout<<nod<<" ";
nr--;
}
else{
/// scot definitiv muchiile care au fost sterse doar la un capat
/// (celalalt capat, nu nod)
/// dar nu le scot pe toate cele posibile, caci as pierde timp cu mutatul altor elemente in vector
/// le scot doar pe cele carora le vine randul, pana cand gasesc una nestearsa, al carei capat il oun in stiva
while(f[v[nod].back().second] == 1)
v[nod].pop_back();
if(v[nod].size()!=0){
vecin = v[nod].back().first; /// capatul unei muchii inca nesterse
f[v[nod].back().second] = 1; /// acum e stearsa si asta
grad[vecin]--, grad[nod]--; /// fiecare are acum cu o muchie mai putin
stiva[++nr] = vecin;
}
}
}
return 0;
}