Cod sursa(job #2818846)

Utilizator CalinCruceanu3576Cruceanu CalinCruceanu3576 Data 16 decembrie 2021 23:53:26
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
#include <bits/stdc++.h>

using namespace std;

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

class Graf
{
private:
  int N, M;
  vector<vector<pair<int, int>>> adj;
  vector<int> circuit;
  vector<bool> viz;
  void Euler();

public:
  Graf(int, int);
  void adaugaMuchie(int, int, int);
  void Afiseaza();
};

Graf ::Graf(int n, int m)
{
  N = n;
  M = m;
  adj.resize(n + 1);
  viz.resize(m + 1);
}

void Graf::adaugaMuchie(int x, int y, int i)
{
  adj[x].push_back(make_pair(y, i));
  adj[y].push_back(make_pair(x, i));
}

void Graf::Euler()
{
  int i, curr;
  stack<int> stk;

  for (i = 0; i < N; ++i)
    if (adj[i].size() & 1)
    {
      fout << -1;
      return;
    }

  stk.push(1);

  while (!stk.empty())
  {
    curr = stk.top();

    if (adj[curr].size())
    {
      pair<int, int> e = adj[curr].back();
      adj[curr].pop_back();

      if (!viz[e.second])
      {
        viz[e.second] = true;
        stk.push(e.first);
      }
    }
    else
    {
      stk.pop();
      circuit.push_back(curr);
    }
  }
}

void Graf::Afiseaza()
{
  Euler();
  for (auto i : circuit)
    fout << i << " ";
}

int main()
{
  int n, m, i, x, y;
  fin >> n >> m;
  Graf G(n, m);
  for (i = 0; i < m; ++i)
  {
    fin >> x >> y;
    G.adaugaMuchie(x, y, i);
  }
  G.Afiseaza();
  return 0;
}