Pagini recente » Borderou de evaluare (job #2741873) | Profil george.ursachi | Cod sursa (job #112198) | Cod sursa (job #780867)
Cod sursa(job #780867)
#include <cstdio>
#include <vector>
#include <stack>
using namespace std;
const int kMaxN = 100005;
vector<int> G[kMaxN];
int N, M;
stack<int> Stack, Cycle;
inline void Delete(const int X, const int Y) {
G[X].pop_back();
for (vector<int>::iterator v = G[Y].begin(); v != G[Y].end(); ++v) {
if (*v == X) {
G[Y].erase(v);
return;
}
}
}
inline void Euler(int X) {
for (int Y; !G[X].empty(); Y = G[X].back(), Delete(X, Y), X = Y)
Stack.push(X);
}
bool EulerianCycle() {
for (int i = 1; i <= N; ++i)
if (G[i].size()&1)
return false;
int X = 1;
do {
Euler(X);
X = Stack.top(); Stack.pop();
Cycle.push(X);
}
while(!Stack.empty());
if (Cycle.size() <= M)
return false;
return true;
}
void Read() {
freopen("ciclueuler.in", "r", stdin);
scanf("%d %d", &N, &M);
for (; M; --M) {
int X, Y; scanf("%d %d", &X, &Y);
G[X].push_back(Y);
G[Y].push_back(X);
}
}
void Print() {
freopen("ciclueuler.out", "w", stdout);
if (!EulerianCycle()) {
printf("-1\n");
return;
}
for (; !Cycle.empty(); Cycle.pop())
printf("%d ", Cycle.top());
printf("\n");
}
int main() {
Read();
Print();
return 0;
}