Cod sursa(job #2883908)

Utilizator cristi_macoveiMacovei Cristian cristi_macovei Data 1 aprilie 2022 22:59:32
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.79 kb
#define d(x) std::cout << x << std::endl
#define dm(msg, x) std::cout << msg << x << std::endl

#define all(a) a.begin(), a.end()
#define range(a, l, r) a.begin() + l, a.begin() + r
#define aall(a, n) a + 1, a + 1 + n
#define arange(a, l, r) a + l, a + r
	
#define maxself(a, b) a = std::max(a, b);
#define minself(a, b) a = std::min(a, b);

#define inout(f) std::ifstream in((f) + (std::string) ".in");std::ofstream out((f) + (std::string) ".out")

#include <iostream>
#include <fstream>
#include <vector>

const int NMAX = 1e5;
const int MMAX = 5e5;

class Edge {
public:
  int node;
  int index;

  Edge(int node, int index):
    node(node), index(index) {};
};

int n, m;

int vis[1 + NMAX];
std::vector<Edge> graph[1 + NMAX];

bool used[1 + MMAX];
std::vector<int> stack;
std::vector<int> ans;

void dfs(int node) {
  vis[node] = true;

  for (auto &edge : graph[node]) {
    if (!vis[edge.node])
      dfs(edge.node);
  }
}

int main() {
  inout("ciclueuler");

  in >> n >> m;

  for (int i = 1; i <= m; ++i) {
    int a, b;
    in >> a >> b;

    graph[a].emplace_back(b, i);
    graph[b].emplace_back(a, i);
  }

  dfs(1);

  for (int i = 1; i <= n; ++i) {
    if (graph[i].size() % 2 == 1 || !vis[i]) {
      out << -1 << '\n';

      return 0;
    }
  }

  stack.push_back(1);
  
  while (!stack.empty()) {
    int cNode = stack.back();

    while (!graph[cNode].empty()) {
      auto edge = graph[cNode].back();
      graph[cNode].pop_back();

      if (used[edge.index])
        continue;
      
      used[edge.index] = true;

      cNode = edge.node;
      stack.push_back(cNode);
    }

    ans.push_back(cNode);
    stack.pop_back();
  }

  ans.pop_back();

  for (int i : ans)
    out << i << ' ';

  return 0;
}