Pagini recente » Cod sursa (job #3003794) | Cod sursa (job #2653444) | Cod sursa (job #2556627) | Cod sursa (job #2595519) | Cod sursa (job #2075293)
#include <bits/stdc++.h>
#define NMAX 100005
#define MMAX 500005
#define pii pair <int, int>
#define INF 0x3f3f3f3f
using namespace std;
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");
int N, M, start;
int viz[MMAX], tip[MMAX], h[NMAX];
vector <pii> v[NMAX];
stack <int> st;
stack <pii> act;
void dfs_iterativ()
{
act.push({1, 0});
while (!act.empty())
{
int nod = act.top().first;
int it = act.top().second;
act.pop();
for (; it < v[nod].size(); it++)
{
pii nxt = v[nod][it];
if (tip[nxt.second] == 0)
{
if (h[nxt.first] < h[nod])
tip[nxt.second] = 2;
else tip[nxt.second] = 1;
h[nxt.first] = min(h[nod] + 1, h[nxt.first]);
act.push({nod, it + 1});
act.push({nxt.first, 0});
break;
}
}
}
}
/**
void rec_iterativ()
{
act.push({1, 0});
while (!act.empty())
{
int nod = act.top().first;
int it = act.top().second;
act.pop();
for (; it < v[nod].size(); it++)
{
pii nxt = v[nod][it];
if (viz[nxt.second] == 0 && tip[nxt.second] == 1)
{
viz[nxt.second] = 1;
rec(nxt.first);
act.push({nod, it + 1});
act.push({nxt.first, 0});
break;
}
}
}
vector <pii> :: iterator it;
/// FATA
for (it = v[nod].begin(); it != v[nod].end(); it++)
{
pii nxt = *it;
if (viz[nxt.second] == 0 && tip[nxt.second] == 1)
{
viz[nxt.second] = 1;
rec(nxt.first);
}
}
/// SPATE
for (it = v[nod].begin(); it != v[nod].end(); it++)
{
pii nxt = *it;
if (viz[nxt.second] == 0 && tip[nxt.second] == 2)
{
viz[nxt.second] = 1;
rec(nxt.first);
}
}
st.push(nod);
}
*/
void rec(int nod)
{
vector <pii> :: iterator it;
/// FATA
for (it = v[nod].begin(); it != v[nod].end(); it++)
{
pii nxt = *it;
if (viz[nxt.second] == 0 && tip[nxt.second] == 1)
{
viz[nxt.second] = 1;
rec(nxt.first);
}
}
/// SPATE
for (it = v[nod].begin(); it != v[nod].end(); it++)
{
pii nxt = *it;
if (viz[nxt.second] == 0 && tip[nxt.second] == 2)
{
viz[nxt.second] = 1;
rec(nxt.first);
}
}
st.push(nod);
}
int main()
{
fin >> N >> M;
for (int i = 1; i <= M; i++)
{
int x, y;
fin >> x >> y;
v[x].push_back({y, i});
v[y].push_back({x, i});
}
for (int i = 1; i <= N; i++)
{
if (v[i].size() % 2 != 0)
{
fout << "-1\n";
return 0;
}
}
for (int i = 2; i <= N; i++)
h[i] = INF;
h[1] = 1;
dfs_iterativ();
rec(1);
while (st.size() != 1)
{
fout << st.top() << " ";
st.pop();
}
return 0;
}