Cod sursa(job #1669903)

Utilizator BrandonChris Luntraru Brandon Data 31 martie 2016 11:16:11
Problema Ciclu Eulerian Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <fstream>
#include <vector>
#include <cstring>

using namespace std;

ifstream cin ("ciclueuler.in");
ofstream cout("ciclueuler.out");

vector <int> G[100005], euler_cycle;

bool used[100005];
int n, m;

class Edge {
public:
  int n1, n2;
};

Edge edge[1000005];

void Dfs(int node) {
  used[node] = true;

  for(auto nxt: G[node]) {
    if(used[nxt]) {
      continue;
    }

    Dfs(nxt);
  }
}

inline bool EulerOK() {
  Dfs(1);

  for(int i = 1; i <= n; ++i) {
    if(!used[i] or G[i].size() % 2 == 1) {
      return 0;
    }
  }

  return 1;
}

inline int NextEdge(int node) {
  while(!G[node].empty() and used[G[node].back()]) {
    G[node].pop_back();
  }

  if(!G[node].empty()) {
    int new_edg = G[node].back();
    G[node].pop_back();
    used[new_edg] = true;
    return edge[new_edg].n1 + edge[new_edg].n2 - node;
  }

  return 0;
}

inline void Euler(int node) {
  //int nxt;

  while(int nxt = NextEdge(node)) {
    Euler(nxt);
  }

  euler_cycle.push_back(node);
}

int main() {
  cin >> n >> m;

  for(int i = 1; i <= m; ++i) {
    int a, b;
    cin >> a >> b;
    edge[i] = {a, b};
    G[a].push_back(i);
    G[b].push_back(i);
  }

  if(!EulerOK()) {
    cout << "-1\n";
    return 0;
  }

  memset(used, 0, sizeof used);

  Euler(1);

  for(int i = 0; i <= (int) euler_cycle.size() - 2; ++i) {
    cout << euler_cycle[i] << ' ';
  }

  cout << '\n';
  return 0;
}