Pagini recente » Cod sursa (job #678438) | Cod sursa (job #2404544)
#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);
while (!st.empty()) {
int i = st.back();
if (v[i].empty()) {
while (!st.empty() && v[st.back()].empty()) {
k++;
rez[k] = st.back();
st.pop_back();
}
}
else {
while (!v[i].empty() && edge[v[i].back()] == 0)
v[i].pop_back();
if (!v[i].empty()){
int j = v[i].back();
v[i].pop_back();
edge[j] = 0;
if (i == src[j])
st.push_back(dest[j]);
else
st.push_back(src[j]);
}
}
}
for (int i = 1; i < k; i++)
fprintf(fout, "%d ", rez[i]);
}
return 0;
}