Cod sursa(job #2216164)

Utilizator dahaandreiDaha Andrei Codrin dahaandrei Data 25 iunie 2018 17:52:53
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <fstream>
#include <vector>
#include <stack>

using namespace std;

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

const int MAXN = 1e5;
const int MAXM = 5e5;

int n, m;
vector<pair<int, int>> g[MAXN + 1];
bool viz[MAXM + 1];
int grad[MAXN + 1];
vector<int> ans;

int main() {
  in >> n >> m;

  for (int i = 1; i <= m; ++ i) {
    int a, b;
    in >> a >> b;
    ++ grad[a]; ++ grad[b];
    g[a].push_back({b, i});
    g[b].push_back({a, i});
  }

  for (int i = 1; i <= n; ++ i) {
    if (grad[i] & 1 || grad[i] == 0) {
      out << -1;
      return 0;
    }
  }

  stack<int> dfs;
  dfs.push(1);

  while (dfs.size()) {
    int node = dfs.top();
    if (g[node].size()) {
      int x = g[node].back().first;
      int muchie = g[node].back().second;
      g[node].pop_back();
      if (!viz[muchie]) {
        viz[muchie] = 1;
        dfs.push(x);
      }
    }
    else {
      ans.push_back(node);
      dfs.pop();
    }
  }

  ans.pop_back();
  for (auto x : ans)
    out << x << ' ';

  return 0;
}