Pagini recente » Cod sursa (job #2326919) | Cod sursa (job #2975792) | Cod sursa (job #2832204) | Cod sursa (job #1425930) | Cod sursa (job #1493826)
#include <bits/stdc++.h>
using namespace std;
const int N = 100005;
const int M = 500005;
vector < pair <int, int> > graf[N];
vector <int> rez;
bitset <N> viz;
bitset <M> m_viz;
int grad[N];
int n, m;
void dfs(int nod)
{
viz[nod] = true;
for (const auto &it : graf[nod])
if (!viz[it.first])
dfs(it.first);
}
void euler(int start)
{
vector <int> stiva;
stiva.clear();
stiva.push_back(start);
while (!stiva.empty())
{
int nod = stiva.back();
if (graf[nod].empty())
{
stiva.pop_back();
rez.push_back(nod);
continue;
}
if (m_viz[graf[nod].back().second])
{graf[nod].pop_back(); continue;}
m_viz[graf[nod].back().second] = true;
stiva.push_back(graf[nod].back().first);
graf[nod].pop_back();
}
}
int main()
{
freopen("ciclueuler.in", "r", stdin);
freopen("ciclueuler.out", "w", stdout);
scanf("%d %d", &n, &m);
for (int i = 1, x, y; i <= m; i++)
scanf("%d %d", &x, &y),
graf[x].push_back(make_pair(y, i)),
graf[y].push_back(make_pair(x, i)),
grad[x]++,
grad[y]++;
dfs(1);
for (int i = 1; i <= n; i++)
if ((grad[i] & 1) || (!viz[i]))
{ printf("-1"); return 0;}
euler(1);
for (vector <int>::iterator it = rez.begin(); it != rez.end() - 1; it++)
printf("%d ", *it);
}