Cod sursa(job #1995967)

Utilizator TincaMateiTinca Matei TincaMatei Data 29 iunie 2017 17:00:30
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <cstdio>

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

bool viz[MAX_M];
int mc[1+2*MAX_M], next[1+2*MAX_M], last[1+MAX_N], idmc[1+2*MAX_M], grad[1+MAX_N];
int top = 0;
int st[1+MAX_M];

void addM(int a, int b, int id, int i) {
  next[id] = last[a];
  last[a] = id;
  mc[id] = b;
  idmc[id] = i;
}

int main() {
  int n, m, a, b, scrise;
  bool ok = true;
  FILE *fin = fopen("ciclueuler.in", "r");
  fscanf(fin, "%d%d", &n, &m);
  for(int i = 0; i < m; ++i) {
    fscanf(fin, "%d%d", &a, &b);
    grad[a]++;
    grad[b]++;
    addM(a, b, i * 2 + 1, i);
    addM(b, a, i * 2 + 2, i);
  }
  fclose(fin);

  for(int i = 0; i < n; ++i)
    if(grad[i] % 2 == 1)
      ok = false;


  FILE *fout = fopen("ciclueuler.out", "w");
  if(ok) {
    scrise = 0;
    st[top++] = 1;
    while(top > 0) {
      int nod = st[top - 1];
      int i = last[nod], id = idmc[i];
      if(last[nod] == 0) {
        if(scrise < m) {
          fprintf(fout, "%d ", nod);
          ++scrise;
        }
        --top;
      } else if(viz[id] == true)
        last[nod] = next[i];
      else {
        viz[id] = true;
        st[top++] = mc[i];
      }
    }
  } else
    fprintf(fout, "-1");
  fclose(fout);
  return 0;
}