Pagini recente » Cod sursa (job #2623535) | Cod sursa (job #2673475) | Cod sursa (job #3210493) | Cod sursa (job #2623586) | Cod sursa (job #2254276)
#include "bits/stdc++.h"
using namespace std;
const int NMax = 100005;
int n,m,x,y;
int grad[NMax];
vector<int> G[NMax];
map<int,int> viz[NMax];
stack<int> st;
void elimin(int u, int v){
viz[u][v]--;
}
int main(){
cin >> n >> m;
for(int i = 1; i <= m; ++i){
cin >> x >> y;
G[x].push_back(y);
G[y].push_back(x);
if(viz[x].find(y) == viz[x].end()){
viz[x][y] = 1;
}else{
viz[x][y] ++;
}
if(viz[y].find(x) == viz[y].end()){
viz[y][x] = 1;
}else{
viz[y][x] ++;
}
grad[x] ++;
grad[y] ++;
}
for(int i = 1; i <= n; ++i){
if(grad[i] & 1){
//no eulerian cycle
cout << -1 << '\n';
return 0;
}
}
int k = 0;
st.push(1);
while(!st.empty()){
int node = st.top();
while(G[node].size() != 0 && viz[node].find(G[node].back()) != viz[node].end() && viz[node][G[node].back()] == 0){
G[node].pop_back();
}
if(G[node].size() == 0){
k++;
if(k > m){
break;
}
cout << node << ' ';
st.pop();
}else{
int new_node = G[node].back();
elimin(new_node,node);
elimin(node,new_node);
st.push(new_node);
}
}
}