Pagini recente » Cod sursa (job #3193696) | Cod sursa (job #2533321) | Cod sursa (job #3250522) | Cod sursa (job #2900277) | Cod sursa (job #3216082)
#include <bits/stdc++.h>
using namespace std;
ifstream in("ciclueuler.in");
ofstream out("ciclueuler.out");
#define pii pair<int, int>
#define pb push_back
#define fi first
#define se second
const int NMAX = 1e5 + 5;
const int INF = 0x3f3f3f3f;
int n, m, x, y;
vector<vector<int>> graph(NMAX);
vector<int> path;
pii edges[NMAX*5];
bool used[NMAX*5];
void read()
{
in >> n >> m;
for (int i = 1; i <= m; i++)
in >> x >> y, graph[x].pb(i), graph[y].pb(i), edges[i] = {x, y};
}
void eulerPath()
{
//drum (chiar ciclu) care contine toate muchiile
vector<int> st;
st.pb(1);
while (!st.empty())
{
int node = st.back();
if (graph[node].empty()) //nu mai face parte din nicio muchie
//deci nu mai putem merge nicaieri, au fost epuizate muchiile pana la nodul asta, deci il putem in path
{
path.pb(node);
st.pop_back(); //il stergem din stack
continue;
}
int e = graph[node].back(); //ultima muchie din care face parte, practic aleatoriu
graph[node].pop_back(); //am epuizat muchia
if (!used[e]) //nu e folosita deja muchie (prin nodul celalalt al ei)
{
used[e] = true;
int to = edges[e].fi ^ edges[e].se ^ node;
//practic daca node = edges[e].fi, atunci se da edges[e].se
//iar daca node = edges[e].se atunci se ia edges[e].fi
// daca a = b atunci a ^ b = 0, si deci a^b^c = c;
st.pb(to);
}
}
}
void solve()
{
for (int i = 1; i <= n; i++)
if (graph[i].size() % 2) //grad impar
{
out << "-1\n";
return;
}
eulerPath();
//path.end()-1 e adresa catre primul element din ciclu, nu-l mai afisez
for (auto node = path.begin(); node <= path.end()-2; node++)
out<<*node<<' ';
}
int main()
{
cin.tie(0);
cout.tie(0);
ios_base::sync_with_stdio(false);
read();
solve();
return 0;
}