Pagini recente » Cod sursa (job #481187) | Cod sursa (job #946593) | Cod sursa (job #8300) | Cod sursa (job #129466) | Cod sursa (job #1182215)
#include <fstream>
#include <vector>
#include <algorithm>
#include <cassert>
using namespace std;
char buff[1 << 23];
int bufferIndex;
int readInt() {
int ret = 0;
while (buff[bufferIndex] < '0' || buff[bufferIndex] > '9') bufferIndex++;
while ('0' <= buff[bufferIndex] && buff[bufferIndex] <= '9') ret = ret * 10 + buff[bufferIndex++] - '0';
return ret;
}
const int NMAX = 100010;
vector<int> G[NMAX];
int res[NMAX * 5];
int st[NMAX * 5];
void euler() {
int n, m;
int v, w;
int Ls = 0;
int top = 0;
int i, j;
int v1 = -1, v2 = -1;
bool bad = false;
v = 0;
n = readInt();
m = readInt();
for (i = 0; i < m; i++) {
v = readInt();
w = readInt();
v--, w--;
// assert(0 <= v && v < n && 0 <= w && w < n);
G[v].push_back(w);
G[w].push_back(v);
}
for (i = 0; i < n; ++i) {
if (G[i].size() & 1) {
if (v1 == -1)
v1 = i;
else if (v2 == -1)
v2 = i;
else {
bad = true;
break;
}
}
}
if (bad) {
printf("-1\n");
for (i = 0; i < n; i++) {
G[i].clear();
}
return;
}
if (v1 != -1) {
G[v1].push_back(v2);
G[v2].push_back(v1);
}
st[top++] = v;
while (top) {
v = st[top - 1];
if (G[v].empty()) {
res[Ls++] = v;
top--;
} else {
w = G[v].back();
G[v].pop_back();
*find(G[w].begin(), G[w].end(), v) = G[w].back();
G[w].pop_back();
st[top++] = w;
}
}
for (i = 0; i < n; i++) {
if (!G[i].empty()) {
bad = 1;
G[i].clear();
}
}
if (bad) {
printf("-1\n");
return;
}
if (v1 != -1) {
printf("-1\n");
return;
for (i = 0; i + 1 < Ls; ++i)
if ((res[i] == v1 && res[i + 1] == v2) || (res[i] == v2 && res[i + 1] == v1)) {
printf("DA\n");
for (j = i + 1; j < Ls; ++j)
printf("%d ", res[j] + 1);
for (j = 1; j <= i; ++j)
printf("%d ", res[j] + 1);
printf("\n");
return;
}
}
if (bad)
printf("-1\n");
else {
for (i = 0; i < Ls; ++i)
printf("%d ", res[i] + 1);
printf("\n");
}
}
int main() {
freopen("ciclueuler.in", "r", stdin);
freopen("ciclueuler.out", "w", stdout);
fread(buff, 1, 1 << 23, stdin);
euler();
return 0;
}