Pagini recente » Cod sursa (job #1740717) | Cod sursa (job #840733) | Cod sursa (job #1506629) | Cod sursa (job #1791087) | Cod sursa (job #2168340)
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");
struct node
{
int x;
node* next;
};
typedef node* LSI;
LSI l1[100005];
int n, m, gr[100005];
vector <int> cycle;
vector <int> stk;
void read();
void insert(LSI& l, int x);
void euler(int nod);
void euler_iterative(int nod);
void delete_edge(int v, int w, node* q);
void delete_edge2(int v, int w);
void write();
int main()
{
int i;
read();
for (i = 1; i <= n; i++)
if (gr[i] % 2)
{
fout << -1 << '\n';
return 0;
}
euler_iterative(1);
//write();
return 0;
}
void read()
{
int i, x, y;
fin >> n >> m;
for (i = 1; i <= m; i++)
{
fin >> x >> y;
insert(l1[x], y); gr[x]++;
insert(l1[y], x); gr[y]++;
}
}
void insert(LSI& l, int x)
{
node* p = new node;
p->x = x; p->next = l;
l = p;
}
void euler_iterative(int nod)
{
int w;
cycle.push_back(nod);
while (!cycle.empty())
{
nod = cycle.back();
if (l1[nod])
{
w = l1[nod]->x;
cycle.push_back(l1[nod]->x); delete_edge2(nod, w);
}
else
{
fout << cycle.back() << ' ';
cycle.pop_back();
}
}
}
void euler(int nod)
{
node* p, *q = new node;
int w;
for (p = l1[nod], q->next = p; p && l1[nod]; q = q->next)
{
w = p->x; p = p->next;
delete_edge(nod, w, q);
euler(w);
}
cycle.push_back(nod);
}
void delete_edge(int v, int w, node* q)
{
node* p;
p = q->next;
q->next = p->next;
delete p; l1[v] = q->next;
p = l1[w];
if (p->x == v)
{
q = p->next;
delete p; l1[w] = q;
}
else
{
for (; p->next->x != v; p = p->next);
q = p->next;
p->next = q->next;
delete q;
}
}
void delete_edge2(int v, int w)
{
node *p, *q;
p = l1[v];
l1[v] = p->next;
delete p;
p = l1[w];
if (p->x == v)
{
l1[w] = p->next;
delete p;
}
else
{
for (; p->next->x != v; p = p->next);
q = p->next;
p->next = q->next;
delete q;
}
}
void write()
{
for (int i = 1; i <= n; i++)
if (l1[i])
{
fout << -1 << '\n';
return;
}
while (!cycle.empty())
{
fout << cycle.back() << ' '; cycle.pop_back();
}
fout << '\n';
}