Pagini recente » Cod sursa (job #224538) | Cod sursa (job #1984099) | Cod sursa (job #1440207) | Cod sursa (job #1584255) | Cod sursa (job #771811)
Cod sursa(job #771811)
/*
Ciclu Eulerian.
*/
#include <iostream>
#include <list>
#include <stack>
#include <queue>
#include <stdio.h>
#define MAXN 100001
using namespace std;
int nr_noduri, nr_muchii;
int grad[MAXN];
bool vizitat[MAXN];
list<int> graf[MAXN], ciclu_eulerian;
stack<int> stiva;
queue<int> coada;
void bfs () {
vizitat[1] = 1;
coada.push(1);
while (!coada.empty()) {
int u = coada.front();
coada.pop();
for (list<int>::iterator v = graf[u].begin(); v != graf[u].end(); v++)
if (!vizitat[*v]) {
vizitat[*v] = 1;
coada.push(*v);
}
}
}
bool e_conex () {
bfs();
for (int u = 2; u <= nr_noduri; u++)
if (!vizitat[u])
return 0;
return 1;
}
bool e_ciclu_eulerian () {
if (!e_conex())
return 0;
for (int u = 1; u <= nr_noduri; u++)
if (grad[u] % 2)
return 0;
return 1;
}
void euler (int u) {
while (1) {
if (graf[u].empty())
break;
int v = graf[u].front();
stiva.push(u);
grad[u]--;
grad[v]--;
graf[u].pop_front();
for (list<int>::iterator w = graf[v].begin(); w != graf[v].end(); w++)
if (*w == u) {
graf[v].erase(w);
break;
}
u = v;
}
}
int afla_ciclu_euler () {
int x = e_ciclu_eulerian();
if (!x)
return -1;
do {
euler(x);
x = stiva.top();
stiva.pop();
ciclu_eulerian.push_back(x);
} while (!stiva.empty());
return 1;
}
int main () {
freopen("ciclueuler.in", "r", stdin);
freopen("ciclueuler.out", "w", stdout);
int i, x, y;
scanf("%d %d", &nr_noduri, &nr_muchii);
for (i = 0; i < nr_muchii; i++) {
scanf("%d %d", &x, &y);
graf[x].push_back(y);
grad[x]++;
graf[y].push_back(x);
grad[y]++;
}
x = afla_ciclu_euler();
if (x == -1)
printf("-1\n");
else {
for (list<int>::iterator it = ciclu_eulerian.begin(); it != ciclu_eulerian.end(); it++)
printf("%d ", *it);
printf("\n");
}
return 0;
}