Pagini recente » Cod sursa (job #428591) | Cod sursa (job #456854) | Cod sursa (job #2607090) | Cod sursa (job #507291) | Cod sursa (job #654486)
Cod sursa(job #654486)
#include <queue>
#include <stack>
#include <bitset>
#include <cstdio>
#include <vector>
#include <iostream>
using namespace std;
FILE* fin = fopen("ciclueuler.in", "r");
#define MAXN 50050
typedef vector<int>::iterator iter;
int n, m;
int grd[MAXN];
vector<int> g[MAXN];
stack<int> stk;
bool isConnex()
{
bitset<MAXN> viz;
queue<int> q;
q.push(1);
viz[1] = true;
while (!q.empty()) {
int nd = q.front();
q.pop();
for (iter it = g[nd].begin(); it != g[nd].end(); ++it) {
if (!viz[*it]) {
viz[*it] = true;
q.push(*it);
}
}
}
for (int i = 1; i <= n; ++i) {
if (!viz[i]) {
return false;
}
}
return true;
}
int euler(int nd)
{
while (!g[nd].empty()) {
int v = *(g[nd].begin());
g[nd].erase(g[nd].begin());
stk.push(nd);
int erased = 0;
for (iter it = g[v].begin(); it != g[v].end(); ++it) {
if (*it == nd) {
erased = *it;
g[v].erase(it);
break;
}
}
nd = v;
}
}
int main()
{
fscanf(fin, "%d %d\n", &n, &m);
freopen("ciclueuler.out", "w", stdout);
for (int i = 0, x, y; i < m; ++i) {
fscanf (fin, "%d %d\n", &x, &y);
grd[x] ++, grd[y] ++;
g[x].push_back(y);
g[y].push_back(x);
}
fclose(fin);
if (!isConnex()) {
printf ("-1\n");
return 0;
}
for (int i = 1; i <= n; ++i) {
if (grd[i] & 1) {
printf ("-1\n");
return 0;
}
}
vector<int> list;
int nd = 1;
do {
euler(nd);
nd = stk.top();
list.push_back(nd);
stk.pop();
} while (!stk.empty());
for (iter it = list.begin(); it != list.end(); ++it) {
printf ("%d ", *it);
}
printf ("\n");
return 0;
}