Cod sursa(job #929126)

Utilizator IoannaPandele Ioana Ioanna Data 26 martie 2013 21:01:10
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
#include <fstream>
#include <vector>
#include <stack>
#define NMAX 100001

std::ofstream out("ciclueuler.out");
std::vector <int> adjacency_list[NMAX];

void read(int &no_vertices,int &no_edges) {
  std::ifstream in("ciclueuler.in");
  in>>no_vertices>>no_edges;
  for (int i = 0; i < no_edges; ++i) {
    int a,b;
    in>>a>>b;
    adjacency_list[a].push_back(b);
    adjacency_list[b].push_back(a);
  }
}

bool IsEulerGraph(int &no_vertices) {
  int degree;
  for (int i = 0; i < no_vertices; ++i) {
    degree = adjacency_list[i].size();
    if (degree & 1) {
      return false;
    }
  }
  return true;
}

void DetermineCycle(int &no_vertices) {
  std::stack <int> my_stack;
  int vertex,next_vertex;
  my_stack.push(1);
  do {
    vertex = my_stack.top();
    my_stack.pop();
    while (!adjacency_list[vertex].empty()) {
      next_vertex = adjacency_list[vertex].back();
      adjacency_list[vertex].pop_back();
      for (std::vector<int>::iterator it = adjacency_list[next_vertex].begin(); it != adjacency_list[next_vertex].end(); ++it) {
        if (*it == vertex) {
          *it = *(adjacency_list[next_vertex].end()-1);
          adjacency_list[next_vertex].pop_back();
          break;
        }
      }
      my_stack.push(vertex);
      vertex = next_vertex;
    }
    if (!my_stack.empty())
      out<<my_stack.top()<<" ";
  } while (!my_stack.empty());
}

int main() {
  int no_vertices,no_edges;

  read(no_vertices,no_edges);

  if (IsEulerGraph(no_vertices)) {
    DetermineCycle(no_vertices);
  } else {
    out<<"-1";
  }

  return 0;
}