Pagini recente » Cod sursa (job #592819) | Cod sursa (job #1170579) | Cod sursa (job #2378448) | Cod sursa (job #40334) | Cod sursa (job #2807608)
#include <fstream>
#include <stack>
#include <vector>
std::ifstream in("ciclueuler.in");
std::ofstream out("ciclueuler.out");
constexpr int N = 1e5+1;
constexpr int M = 5e5+1;
std::stack<int> st;
std::pair<int, int> edges[M]; // edge[i] = {a,b} -> a, b are vertices of edge i
std::vector<int> g[N]; // g[a] -> the set of edges of vertice a
int poz[N], n, m, rez[M], cnt;
bool removed[M];
bool is_euler(){
for(int i=1;i<=n;++i){
if(g[i].size() % 2)
return false;
}
return true;
}
int search_edge(int x){
int lim = g[x].size();
for(int i = poz[x]; i < lim; ++ i){
int edge = g[x][i];
if(!removed[edge]){
removed[edge] = true;
poz[x] = i + 1;
return edge;
}
}
return -1;
}
int main(){
in >> n >> m;
for(int i=0;i<m;++i){
int x, y;
in >> x >> y;
edges[i] = { x, y };
g[x].push_back(i);
g[y].push_back(i);
}
in.close();
if(!is_euler()){
out << -1;
return 0;
}
st.push(1);
while(!st.empty()){
int ver = st.top();
int edge = search_edge(ver);
if(edge == -1){
st.pop();
if(st.empty()) break;
rez[cnt++] = ver;
}
else{
int top_ver = edges[edge].first==ver ? edges[edge].second : edges[edge].first ;
st.push(top_ver);
}
}
if(cnt!=m){
out<<-1;
return 0;
}
for(int i=0;i<cnt;++i)
out<<rez[i]<<' ';
out.close();
return 0;
}