Cod sursa(job #2928404)

Utilizator YusyBossFares Yusuf YusyBoss Data 22 octombrie 2022 21:08:15
Problema Ciclu Eulerian Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.44 kb
#include <bits/stdc++.h>
#define NMAX 100000
#define MMAX 500000

using namespace std;

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

struct strson {
  int node;
  int index;
};

bool is_used_edge[MMAX + 1];
vector <strson> vsons[NMAX + 1];
vector <int> vcicle;

bool is_eulerian_graph(int n) {
  int i;

  i = 1;
  while (i <= n && vsons[i].size() % 2 == 0)
    i++;

  return i > n;
}

bool check_last_son(int node) {
  strson top = vsons[node].back();
  return is_used_edge[top.index];
}

void dfs(int node) {
  while (!vsons[node].empty() && check_last_son(node))
    vsons[node].pop_back();

  if (!vsons[node].empty()) {
    vcicle.push_back(node);
    strson top = vsons[node].back();
    vsons[node].pop_back();
    is_used_edge[top.index] = true;

    dfs(top.node);
  }
}

int main() {
  int n, m, node1, node2, i;
  fin >> n >> m;

  for (i = 0; i < m; i++) {
    fin >> node1 >> node2;
    vsons[node1].push_back({node2, i});
    vsons[node2].push_back({node1, i});
  }

  if (is_eulerian_graph(n)) {
    dfs(1);

    for (i = 1; i <= n; i++) {
      while (!vsons[i].empty() && check_last_son(i))
        vsons[i].pop_back();
    }


    i = 1;
    while (i <= n && vsons[i].empty())
      i++;

    if (i > n) {
      for (i = 0; i < vcicle.size(); i++)
        fout << vcicle[i] << " ";
    }
    else
      fout << -1;
  }
  else
    fout << -1;
  return 0;
}