Cod sursa(job #2738276)

Utilizator MoodyFaresFares Mohamad MoodyFares Data 5 aprilie 2021 17:25:20
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.19 kb
#include <cstdio>
#include <vector>

using namespace std;

const int MAX_N = 100000;
const int MAX_M = 500000;

struct Edge {
  int u;
  int index;
};

vector<Edge> g[5 + MAX_N];
int dg[5 + MAX_N];
bool del[5 + MAX_M];
vector<int> cycle;

void euler(int node) {
  while (dg[node] > 0) {
    while (dg[node] > 0 && del[g[node][dg[node] - 1].index])
      dg[node]--;

    if (dg[node] > 0) {
      int u, e;
      u = g[node][dg[node] - 1].u;
      e = g[node][dg[node] - 1].index;
      del[e] = true;
      dg[node]--;
      euler(u);
    }
  }

  cycle.push_back(node);
}

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++) {
    int u, v;
    scanf("%d%d", &u, &v);
    g[u].push_back({v, i});
    g[v].push_back({u, i});
  }

  for (int i = 1; i <= n; i++) {
    dg[i] = g[i].size();
    if (dg[i] % 2 == 1) {
      printf("-1\n");
      return 0;
    }
  }

  euler(1);
  cycle.pop_back();
  if (cycle.size() != m)
    printf("-1\n");
  else {
    for (auto u : cycle)
      printf("%d ", u);
    printf("\n");
  }

  return 0;
}