Pagini recente » Cod sursa (job #382905) | Cod sursa (job #2459509) | Cod sursa (job #3178401) | Cod sursa (job #250859) | Cod sursa (job #2323276)
#include <iostream>
#include <cstdio>
#include <list>
#include <algorithm>
#define NMAX 100010
#define MMAX 500010
using namespace std;
struct Nod {
int inf;
Nod* next;
Nod* prev;
Nod* comp;
Nod(int _inf) : inf(_inf) {
next = nullptr;
prev = nullptr;
comp = nullptr;
}
};
struct LinkedList {
Nod* start;
Nod* fin;
int sz;
LinkedList() {
start = fin = nullptr;
sz = 0;
}
Nod* push(int val) {
Nod* toAdd = new Nod(val);
if (start == nullptr) {
start = fin = toAdd;
}
else {
fin->next = toAdd;
toAdd->prev = fin;
fin = toAdd;
}
sz++;
return toAdd;
}
pair<int, Nod*> pop() {
int vecin = fin->inf;
Nod* comp = fin->comp;
rm(fin);
return {vecin, comp};
}
void rm(Nod* it) {
if (fin == it)
fin = it->prev;
if (start == it)
start = it->next;
if (it->next != nullptr)
it->next->prev = it->prev;
if (it->prev != nullptr)
it->prev->next = it->next;
sz--;
delete it;
}
int size() {
return sz;
}
bool empty() {
return sz == 0;
}
};
int n, m, sterse;
LinkedList v[NMAX];
int stiv[MMAX], st;
void citire()
{
scanf("%d %d", &n, &m);
int t1, t2;
for (int i = 1; i <= m; i++)
{
scanf("%d %d", &t1, &t2);
Nod* s1 = v[t1].push(t2);
Nod* s2 = v[t2].push(t1);
s1->comp = s2;
s2->comp = s1;
}
}
void euler()
{
for (int i = 1; i <= n; i++)
if (v[i].size()%2)
{
printf("-1");
return;
}
stiv[++st] = 1;
while (st > 0)
{
int top = stiv[st];
if (v[top].empty())
{
printf("%d ", top);
st--;
}
else {
pair<int, Nod*> next = v[top].pop();
v[next.first].rm(next.second);
stiv[++st] = next.first;
}
}
}
int main()
{
std::ios::sync_with_stdio(false);
freopen("ciclueuler.in", "r", stdin);
freopen("ciclueuler.out", "w", stdout);
citire();
euler();
return 0;
}