Pagini recente » Cod sursa (job #1444441) | Cod sursa (job #2980226) | Cod sursa (job #877056) | Cod sursa (job #1164178) | Cod sursa (job #369050)
Cod sursa(job #369050)
# include <cstdio>
# include <vector>
using namespace std;
# define FIN "ciclueuler.in"
# define FOUT "ciclueuler.out"
# define MAX_N 100005
# define MAX_M 500005
# define pb push_back
# define f first
# define s second
int N, M, i;
int dg[MAX_M];
vector <int> G[MAX_N];
pair <int, int> P[MAX_M];
vector <int> Sol;
vector <int> Stack;
void del_used_edge(int Nod)
{
for (; !G[Nod].empty();)
if (dg[G[Nod].front()]) G[Nod].erase(G[Nod].begin());
else return;
}
void euler()
{
int Nod, newNod;
Nod = 1;
Stack.pb(Nod);
while (!Stack.empty())
{
del_used_edge(Nod);
if (!G[Nod].empty())
{
Nod == P[G[Nod].front()].f ? newNod = P[G[Nod].front()].s : newNod = P[G[Nod].front()].f;
Stack.pb(newNod);
dg[G[Nod].front()] = 1;
G[Nod].erase(G[Nod].begin());
Nod = newNod;
} else
{
Nod = Stack.back();
del_used_edge(Nod);
if (G[Nod].empty())
{
Stack.pop_back();
Sol.pb(Nod);
}
}
}
}
int main()
{
freopen(FIN, "r", stdin);
freopen(FOUT, "w", stdout);
scanf("%d%d", &N, &M);
int a, b;
for (i = 1; i <= M; ++i)
{
scanf("%d%d", &P[i].f, &P[i].s);
++dg[P[i].f]; ++dg[P[i].s];
G[P[i].f].pb(i); G[P[i].s].pb(i);
}
for (i = 1; i <= N; ++i)
if ((dg[i] & 1)) { printf("-1\n"); return 0; }
memset(dg, 0, sizeof(dg));
euler();
memset(dg, 0, sizeof(dg));
vector <int> :: iterator it;
for (it = Sol.begin(); it != Sol.end(); ++it) dg[*it] = 1;
for (i = 1; i <= N; ++i)
if (!dg[i]) { printf("-1\n"); return 0; }
Sol.pop_back();
for (it = Sol.begin(); it != Sol.end(); ++it) printf("%d ", *it);
return 0;
}