Pagini recente » Cod sursa (job #458355) | Cod sursa (job #2045619) | Cod sursa (job #2367520) | Cod sursa (job #474680) | Cod sursa (job #2575264)
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100005;
const int MAXM = 500005;
struct Edge {
int u, v;
int other (const int node) {
return u ^ v ^ node;
}
}e[MAXM];
bool elim[MAXM];
vector<int>G[MAXN], G1[MAXN], G2[MAXN];
int gr[MAXN];
bool vis[MAXN];
int sz1[MAXN], sz2[MAXN];
void dfs(int node, int papa) {
vis[node] = 1;
for (auto it:G[node])
if (it != papa) {
int u = e[it].other(node);
if (!vis[u]) {
G1[u].push_back(it);
G1[node].push_back(it);
sz1[node]++;
sz1[u]++;
dfs(u, it);
} else {
G2[u].push_back(it);
G2[node].push_back(it);
sz2[node]++;
sz2[u]++;
}
}
}
int main() {
freopen("ciclueuler.in", "r", stdin);
freopen("ciclueuler.out", "w", stdout);
int n, m;
scanf("%d%d", &n, &m);
for (int i = 1; i <= m; ++i) {
scanf("%d%d", &e[i].u, &e[i].v);
G[e[i].u].push_back(i);
G[e[i].v].push_back(i);
gr[e[i].u]++;
gr[e[i].v]++;
}
for (int i = 1; i <= n; ++i)
if (gr[i] % 2) {
printf("-1\n");
return 0;
}
dfs(1, 0);
for (int i = 1; i <= n; ++i)
if (!vis[i]) {
printf("-1\n");
return 0;
}
int node = 1;
for (int i = 1; i <= m; ++i) {
printf("%d ", node);
while (sz2[node] && elim[G2[node][sz2[node] - 1]])
sz2[node]--;
while (sz1[node] && elim[G1[node][sz1[node] - 1]])
sz1[node]--;
if (sz2[node]) {
int edge = G2[node][sz2[node] - 1];
elim[edge] = 1;
node = e[edge].other(node);
} else if (sz1[node]){
int edge = G1[node][sz1[node] - 1];
elim[edge] = 1;
node = e[edge].other(node);
}
}
return 0;
}