Cod sursa(job #2345519)

Utilizator AlexPop28Pop Alex-Nicolae AlexPop28 Data 16 februarie 2019 14:10:47
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.69 kb
#include <bits/stdc++.h>
#define all(cont) cont.begin(), cont.end()
#define pb push_back
#define fi first
#define se second
#define DEBUG(x) cerr << (#x) << ": " << (x) << '\n'
#define close() f.close(); g.close(); return 0

using namespace std;

typedef pair <int, int> pii;
typedef vector <int> vi;
typedef long long ll;
typedef unsigned long long ull;

template <class T> void uin (T &a, T b) {a = min (a, b);}
template <class T> void uax (T &a, T b) {a = max (a, b);}

ifstream f ("ciclueuler.in");
ofstream g ("ciclueuler.out");

int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
#ifdef LOCAL_DEFINE
  freopen (".in", "r", stdin);
#endif

  int n, m;
  f >> n >> m;
  vector <vi> adj (n + 2);
  vi from (m + 2, 0), to (m + 2, 0);
  for (int i = 1; i <= m; ++i) {
    int u, v;
    f >> u >> v;
    adj[u].pb (i);
    adj[v].pb (i);
    from[i] = u;
    to[i] = v;
  }

  for (int i = 1; i <= n; ++i) {
    if ((adj[i].size() & 1)) {
      g << "-1\n";
      close();
    }
  }

  function <int (int, int)> other = [&] (int node, int edge) {
    return (node ^ from[edge] ^ to[edge]);
  };

  int last = -1;
  vi stk;
  stk.pb (1);
  vector <bool> vis (m + 2, false);
  while (!stk.empty()) {
    int node = stk.back();
    if (!adj[node].empty()) {
      int edge = adj[node].back();
      adj[node].pop_back();
      if (!vis[edge]) {
        vis[edge] = true;
        stk.pb (other (node, edge));
      }
    } else {
      if (last != -1) g << last << ' ';
      last = node;
      stk.pop_back();
    }
  }

  close();

#ifdef LOCAL_DEFINE
  cerr << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << " s.\n";
#endif
  return 0;
}