Cod sursa(job #1996119)

Utilizator TincaMateiTinca Matei TincaMatei Data 30 iunie 2017 11:11:23
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.79 kb
#include <cstdio>
#include <ctype.h>

#warning ALO ALO AMBULANTA, AM SUNAT CA SA VA SPUN, SA VENITI SA LUATI DUJMANII, C-AU AFLAT C-AM DAT IAR TUN

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

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];
int buff = BUFF - 1;
char buftea[BUFF];

char getch(FILE *fin) {
  buff++;
  if(buff == BUFF) {
    buff = 0;
    fread(buftea, 1, BUFF, fin);
  }
  return buftea[buff];
}

int getnr(FILE *fin) {
  int nr = 0;
  char ch = getch(fin);
  while(!isdigit(ch))
    ch = getch(fin);
  while(isdigit(ch)) {
    nr = nr * 10 + ch - '0';
    ch = getch(fin);
  }
  return nr;
}

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");
  n = getnr(fin);
  m = getnr(fin);
  for(int i = 0; i < m; ++i) {
    a = getnr(fin);
    b = getnr(fin);
    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;
}