Pagini recente » Cod sursa (job #846549) | Cod sursa (job #349845) | Cod sursa (job #92840) | Cod sursa (job #1270714) | Cod sursa (job #2404540)
#include <cstdio>
#include <vector>
#define MAXN 100000
#define MAXM 500000
FILE *fin = fopen("ciclueuler.in", "r");
FILE *fout = fopen("ciclueuler.out", "w");
std::vector <int> st;
std::vector <int> v[MAXN + 1];
int edge[MAXM + 1];
int src[MAXM + 1];
int dest[MAXM + 1];
int grad[MAXN + 1];
int rez[MAXM + 1];
bool apare[MAXN + 1];
int main()
{
int n, m, x, y, k = 0;
fscanf(fin, "%d%d", &n, &m);
for (int i = 1; i <= m; i++) {
fscanf(fin, "%d%d", &x, &y);
v[x].push_back(i);
v[y].push_back(i);
grad[x]++;
grad[y]++;
edge[i] = 1;
src[i] = x;
dest[i] = y;
}
bool ok = 1;
for (int i = 1; i <= n; i++) {
if (grad[x] % 2 == 1)
ok = 0;
}
if (ok == 0) {
fprintf(fout, "-1");
}
else {
st.push_back(1);
int l = 0;
while (!st.empty() && l < 5) {
int i = 0;
int j = st.back();
if (apare[j] == 1) {
if (grad[st.back()] == 0)
while(!st.empty() && grad[st.back()] == 0) {
k++;
rez[k] = st.back();
st.pop_back();
}
else
apare[j] = 0;
}
if (apare[j] == 0) {
apare[j] = 1;
int siz = v[j].size();
while (edge[v[j][i]] != 1 && i < siz)
i++;
if (i < siz) {
edge[v[j][i]] = 0;
grad[j]--;
if (src[v[j][i]] == j) {
st.push_back(dest[v[j][i]]);
grad[dest[v[j][i]]]--;
}
else {
st.push_back(src[v[j][i]]);
grad[src[v[j][i]]]--;
}
}
}
}
for (int i = 1; i < k; i++)
fprintf(fout, "%d ", rez[i]);
}
return 0;
}