Pagini recente » Cod sursa (job #331887) | Cod sursa (job #404030) | Cod sursa (job #3333650) | Monitorul de evaluare | Cod sursa (job #3337993)
#include<iostream>
#include<vector>
#include<unordered_set>
#include<set>
#include<unordered_map>
#include<bitset>
using namespace std;
#define NMAX 100001
int n,m;
vector<int>g[NMAX];
bitset<NMAX>b;
struct HASH{
template<typename T>
size_t operator()(T vl)const{
hash<int>h;
return size_t(h(vl.first))^size_t(h(vl.second));
}
};
unordered_map<pair<int,int>,int,HASH>mucs;
auto check_dfs(int i)->void{
b[i]=true;
if(g[i].size()%2){
// nu poate fi ciclu euleria pt ca nodul i are nr de vecini impar
cout<<-1;
exit(0);
}
for(auto it:g[i]){
if(b[it])continue;
check_dfs(it);
}
}
vector<int>sol;
auto euler(int i)->void{
for(auto it:g[i]){
if(mucs[{i,it}]){
--mucs[{i,it}];
--mucs[{it,i}];
euler(it);
}
}
sol.push_back(i);
}
auto main(void)->signed{
#ifndef LOCAL
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
#endif
freopen("ciclueuler.in","r",stdin);
freopen("ciclueuler.out","w",stdout);
cin>>n>>m;
for(int i=1;i<=m;++i){
int x,y;
cin>>x>>y;
g[x].push_back(y);
g[y].push_back(x);
mucs[{x,y}]++;
mucs[{y,x}]++;
}
// daca fiecare nod din graf are un nr par de vecini acela e ciclu eulerian
// altfel nu e
check_dfs(1);
euler(1);
if(sol.size()>1)sol.pop_back();
for(auto it:sol)cout<<it<<" ";
return 0;
}