Cod sursa(job #2575264)

Utilizator MiricaMateiMirica Matei MiricaMatei Data 6 martie 2020 12:30:57
Problema Ciclu Eulerian Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.75 kb
#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;
}