Cod sursa(job #2092387)

Utilizator Robert_VRVRobert Vadastreanu Robert_VRV Data 21 decembrie 2017 16:43:24
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <fstream>
#include <vector>
#include <stack>

using namespace std;

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

const int MAX_N = 100000;
const int MAX_M = 500000;

struct Edge {
  int u;
  int v;
  bool visited;

  int other(int vertex) {
    return u + v - vertex;
  }
};

int n, m;
Edge edges[1 + MAX_M];
vector<Edge*> neighbours[1 + MAX_N];
stack<int> answer;

void euler(int u) {
  for (Edge *e : neighbours[u]) {
    if (!e->visited) {
      e->visited = true;
      euler(e->other(u));
    }
  }
  answer.push(u);
}


int main()
{
  fin >> n >> m;
  for (int i = 1; i <= m; i++)  {
    int p, q;
    fin >> p >> q;
    edges[i] = Edge{p, q, false};
    neighbours[p].push_back(&edges[i]);
    neighbours[q].push_back(&edges[i]);
  }
  fin.close();
  int u = 1;
  while (u <= n && neighbours[u].size() == 0)
    u++;
  if (u > n)
    fout << "-1";
  else {
    euler(u);
    if ((int)answer.size() != m + 1)
      fout << "-1";
    else
    while (answer.size() > 1) {
      fout << answer.top() << " ";
      answer.pop();
    }
  }
  fout << '\n';
  fout.close();
  return 0;
}