Pagini recente » Cod sursa (job #2396911) | Cod sursa (job #1281200) | Cod sursa (job #2838600) | Cod sursa (job #3161193) | Cod sursa (job #2958294)
#include<iostream>
#include<deque>
#include<algorithm>
#include<vector>
#include<fstream>
#include<stack>
using namespace std;
ifstream in("ciclueuler.in");
ofstream out("ciclueuler.out");
struct edge{
int a,b;
bool visited;
};
int n,m;
vector<vector<edge*>> g;
vector<edge> edges;
vector<int> result;
vector<int> progress;
void read(){
in>>n>>m;
g.resize(n+1);
progress.resize(n+1);
edges.resize(m);
int a,b;
for(int i=0;i<m;i++){
in>>a>>b;
edges[i] = {a,b,false};
g[a].push_back(&edges[i]);
g[b].push_back(&edges[i]);
}
}
void solve(){
for(int i=1;i<=n;i++){
if(g[i].size()%2==1){
out<<-1;
return;
}
}
stack<int> s;
s.push(1);
while(!s.empty()){
int here = s.top();
while(progress[here] < (int) g[here].size() && g[here][progress[here]]->visited){
progress[here]++;
}
if(progress[here] == (int) g[here].size()){
result.push_back(here);
s.pop();
}
else{
edge* e = g[here][progress[here]];
int next = e->a == here ? e->b : e->a;
e->visited = true;
progress[here]++;
s.push(next);
}
}
result.pop_back();
for(int k:result){
out<<k<<" ";
}
}
int main(){
read();
solve();
return 0;
}