Pagini recente » Monitorul de evaluare | Cod sursa (job #3337994)
#include<iostream>
#include<vector>
#include<unordered_set>
#include<bitset>
using namespace std;
#define NMAX 100001
int n,m;
unordered_multiset<int>g[NMAX];
bitset<NMAX>b;
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{
while(g[i].size()){
int it=*g[i].begin();
g[i].erase(g[i].begin());
auto rm=g[it].find(i);
g[it].erase(rm);
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].insert(y);
g[y].insert(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;
}