Pagini recente » Cod sursa (job #3290729) | Cod sursa (job #3208680) | Cod sursa (job #1254618) | Cod sursa (job #714476) | Cod sursa (job #3197793)
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;
ifstream cin("ciclueuler.in");
ofstream cout("ciclueuler.out");
struct edge{
int n1,n2;
};
edge edges[1000001];
vector<int> G[100001], ciclu;
bool used[1000001];
int n,m;
void dfs(int node){
used[node] = 1;
for(auto nxt : G[node]){
if(used[edges[nxt].n1 + edges[nxt].n2 - node]){
continue;
}
dfs(edges[nxt].n1 + edges[nxt].n2 - node);
}
}
bool eulerok(){
dfs(1);
for(int i=1; i<=n; i++)
if(!used[i] || G[i].size() % 2 == 1){
return 0;
}
return 1;
}
int nextedge(int node){
while(!G[node].empty() && used[G[node].back()])
G[node].pop_back();
if(!G[node].empty()){
int new_edge = G[node].back();
G[node].pop_back();
used[new_edge] = 1;
if(edges[new_edge].n1 == node)
return edges[new_edge].n2;
else
return edges[new_edge].n1;
}
return 0;
}
void euler(int node){
while(int nxt = nextedge(node))
euler(nxt);
ciclu.push_back(node);
}
int main()
{
cin>>n>>m;
for(int i=1; i<=m; i++){
int x, y;
cin >> x >> y;
edges[i] = {x, y};
G[x].push_back(i);
G[y].push_back(i);
}
if(!eulerok()){
cout<<"-1"<<'\n';
return 0;
}
memset(used, 0, sizeof used);
euler(1);
for(int i=0; i <= (int)ciclu.size() - 2; i++)
cout<<ciclu[i]<<' ';
cout<<'\n';
return 0;
}