Cod sursa(job #1821581)

Utilizator tudorcomanTudor Coman tudorcoman Data 3 decembrie 2016 12:45:55
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 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;
  }
};

Muchie muc[1 + MAX_M];
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++) {
    scanf("%d %d", &muc[i].u, &muc[i].v);
    muc[i].viz = false;
    muchii[muc[i].u].push_back(&muc[i]);
    muchii[muc[i].v].push_back(&muc[i]);
  }

  for(int i = 1; i <= N; ++ i) {
    if(muchii[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;
      while(muchii[nod].size() > 0 and muchii[nod].back()->viz)
        muchii[nod].pop_back();
      if(muchii[nod].empty()) {
        if(top > 1)
          printf("%d ", nod);
        -- top;
      } else {
        muchii[nod].back()->viz = true;
        st[++ top] = muchii[nod].back()->vecin(nod);
        muchii[nod].pop_back();
      }
    }
  } else
    puts("-1");

  return 0;
}