Cod sursa(job #1821567)

Utilizator tudorcomanTudor Coman tudorcoman Data 3 decembrie 2016 12:33:02
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
#include <cstdio>
#include <algorithm>
#include <bitset>
using namespace std;

const int MAX_N = 100000;
const int MAX_M = 500000;
bool viz[1 + MAX_N];

class Muchie {
public:
  int u;
  int v;
  bool viz;

  Muchie(int _u = 0, int _v = 0, bool _viz = false):
    u(_u), v(_v), viz(_viz) { }

  inline int vecin(int nod) {
    return u + v - nod;
  }
};

vector<Muchie*> muchii[1 + MAX_N];

inline void dfs(int nod, int& dim) {
  if(!viz[nod]) {
    viz[nod] = true;
    ++ dim;
    for(auto *it: muchii[nod])
      dfs(it->vecin(nod), dim);
  }
}

int st[1 + MAX_M], top;

int main() {
  freopen("ciclueuler.in", "r", stdin);
  freopen("ciclueuler.out", "w", stdout);

  int N, M;
  scanf("%d%d", &N, &M);
  for(int i = 0; i < M; i++) {
    int u, v;
    scanf("%d %d", &u, &v);
    Muchie* m = new Muchie(u, v);
    muchii[u].push_back(m);
    muchii[v].push_back(m);
  }

  for(int i = 1; i <= N; ++ i) {
    if(G[i].size() & 1) {
      puts("-1");
      return 0;
    }
  }

  int cc = 0, root;
  for(int i = 1; i <= N; ++ i) {
    if(!viz[i]) {
      int dim = 0;
      dfs(i, dim);
      if(dim > 1) {
        ++ cc;
        root = i;
      }
    }
  }

  if(cc == 1) {
    st[++ top] = root;
    while(top > 0) {
      int nod = st[top];
      bool izolat = true;
      for(Muchie *m : muchii[nod]) {
        int vecin = m->vecin(nod);
        if(m->viz == false) {
          izolat = false;
          m->viz = true;
          st[++ top] = vecin;
          break;
        }
      }

      if(izolat) {
      	if(top > 1)
          printf("%d ", nod);
        -- top;
      }
    }
  } else
    puts("-1");

  return 0;
}