Cod sursa(job #1995936)

Utilizator TincaMateiTinca Matei TincaMatei Data 29 iunie 2017 16:26:28
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include <cstdio>

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

int top = 0;
int a[MAX_M], b[MAX_M];
bool viz[MAX_M];
int mc[1+2*MAX_M], next[1+2*MAX_M], last[1+MAX_N], idmc[1+2*MAX_M];
int euler[1+2*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;
}

void dfs(int nod) {
  printf("%d\n", nod);
  while(last[nod] != 0) {
    int i = last[nod], id = idmc[last[nod]];
    if(viz[id] == true)
      last[nod] = next[last[nod]];
    else {
      last[nod] = next[last[nod]];
      viz[id] = true;
      dfs(mc[i]);
    }
  }
  euler[top++] = nod;
}

int main() {
  int n, m, a, b;
  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);
    addM(a, b, i * 2 + 1, i);
    addM(b, a, i * 2 + 2, i);
  }
  fclose(fin);

  dfs(1);

  FILE *fout = fopen("ciclueuler.out", "w");
  for(int i = 0; i < top - 1; ++i)
    fprintf(fout, "%d ", euler[i]);
  fclose(fout);
  return 0;
}