Cod sursa(job #1896532)

Utilizator stoianmihailStoian Mihail stoianmihail Data 28 februarie 2017 19:04:00
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
#include <stdio.h>

#define MAX_N 100000
#define MAX_M 500000
#define NIL -1

typedef struct {
  int v, next;
} list;

int N, M, buff;
int adj[MAX_N + 1];
list l[2 * MAX_M + 1];
int stack[MAX_N + 1];
int inside[MAX_N + 1];

void addEdge(int u, int v) {
  buff++;
  inside[u]++;
  l[buff].v = v;
  l[buff].next = adj[u];
  adj[u] = buff;
}

int check(int pos, int u) {
  if (l[pos - 1].v == u) {
    return pos - 1;
  }
  return pos + 1;
}

void euler(int u) {
  int pos, ss = 0;
  stack[ss++] = u;
  do {
    u = stack[ss - 1];
    if (!inside[u]) {
      ss--;
      if (ss) {
        fprintf(stdout, "%d ", u);
      }
    } else {
      pos = adj[u];
      while (pos && l[pos].v == NIL) {
        pos = l[pos].next;
      }
      adj[u] = pos;
      if (u > l[pos].v) {
        inside[l[pos + 1].v]--;
        l[pos + 1].v = NIL;
      } else {
        inside[l[pos - 1].v]--;
        l[pos - 1].v = NIL;
      }
      inside[u]--;
      stack[ss++] = l[pos].v;
      l[pos].v = NIL;
    }
  } while (ss);
}

int main(void) {
  int i, u, v;
  FILE *f = fopen("ciclueuler.in", "r");

  fscanf(f, "%d %d", &N, &M);
  for (i = 1; i <= M; i++) {
    fscanf(f, "%d %d", &u, &v);
    if (u > v) {
      addEdge(u, v);
      addEdge(v, u);
    } else {
      addEdge(v, u);
      addEdge(u, v);
    }
  }
  fclose(f);

  u = 1;
  while (u <= N && inside[u] % 2 == 0) {
    u++;
  }

  freopen("ciclueuler.out", "w", stdout);
  if (u <= N) {
    fprintf(stdout, "%d\n", NIL);
  } else {
    euler(1);
  }
  fclose(stdout);
  return 0;
}